2011-04-12 240 views
0

据我了解,如果我不存储指针,C++中的所有内容都会被复制,这可能导致性能不佳(忽略我的示例的简单性)。所以我想我把我的对象存储为我的向量中的指针而不是字符串对象,这对性能更好吗? (假设我有很长的字符串和很多)。C++向量和指针

当我尝试遍历我的字符串指针的向量的问题是我不能从中提取的实际值

string test = "my-name"; 
vector<string*> names(20); 
names.push_back(&test); 

vector<string*>::iterator iterator = names.begin(); 
while (iterator != names.end()) 
{ 
    std::cout << (*iterator) << ":" << std::endl; 
    // std::cout << *(*iterator); // fails 

    iterator++; 
} 

见注释行,我没有问题,在接受字符串指针。但是,当我尝试获取字符串指针值我得到一个错误(我找不到什么兴奋的错误是,但程序只是失败)。

我也尝试存储(迭代器)在一个新的字符串变量,但它没有帮助?

+0

@mads失败?有例外吗?不编译?测试仍在范围内? – Lou 2011-04-12 15:51:30

+0

空指针和指向本地作用域变量的指针?难怪你有问题得到它们指向的实际值 – 2011-04-12 15:54:43

+0

你是否对你的代码进行了剖析并证明这是一个严重的问题?还是你在微观优化prematureley? – 2011-04-12 15:57:25

回答

5

您已创建矢量并将其初始化为包含20个项目。这些项目正在被默认初始化,这在指针的情况下是空指针。该程序无法取消引用这些空指针。

一个建议是不要担心什么是最有效的,直到你有一个演示的问题。这个代码当然会更好用vector<string>vector<string*>

+0

谢谢,当你把头围绕在它身上时,这很有意义:) – 2011-04-12 16:04:15

0

你的代码看起来像你正在将一个指向基于栈的变量的指针存储到一个向量中。只要声明你的字符串的函数返回,那个字符串就变成垃圾,指针也是无效的。如果要将指针存储到向量中,则可能需要动态分配字符串(使用新的)。

0

有一个在你的初始化:

string test = "my-name"; 
vector<string*> names(20); 
names.push_back(&test); 

首先创建一个std::vector 20元。

然后您使用push_back附加第21个元素,该元素指向有效的string。这很好,但是这个元素在循环中永远不会到达:第一次迭代已经崩溃了,因为存储在向量中的前20个指针并不指向有效的string s。

解引用无效指针会导致崩溃。如果你确定你的向量中有一个有效的指针,**iterator就可以很好地访问一个元素。

0

尝试

if (*iterator) 
{ 
    std::cout << *(*iterator) << ":" << std::endl; 
} 

马克赎金解释了为什么一些指针现在

1

不,不,一千个不。

不要过早优化。如果程序速度很快,则无需担心性能。在这种情况下,由于每个对象只是单个指针的目标,所以指针会消耗内存和时间,从而明显降低性能!

更不用说手动指针编程往往会引入错误,特别是对于新手。牺牲性能的正确性和稳定性是向后退步的一大步。

C++的优势在于它通过提供封装的数据结构和算法简化了优化过程。因此,当您决定进行优化时,通常可以通过交换标准零件来实现。

如果您想了解优化数据结构,请阅读smart pointers

这可能是你想要的程序:

vector<string> names(20, "my-name"); 

for (vector<string>::iterator iterator = names.begin(); 
     iterator != names.end(); 
     ++ iterator) 
{ 
    std::cout << *iterator << '\n'; 
} 
0
string test = "my-name"; 
vector<string*> names(20); 

载体的size是20,这意味着它可以容纳20个字符串指针。

names.push_back(&test); 

随着push_back操作,离开了第一个20个元件和添加新的元件来保持的test地址的矢量。前20个矢量元素未初始化,可能指向垃圾。并且while循环一直运行到大小为21的向量的末尾,并且取消引用未初始化的指针就是导致问题的原因。由于vector的尺寸可以通过push_back操作动态增加,因此不需要明确提及尺寸。

vector<string*> names; // Not explicitly mentioning the size and the rest of 
         // the program should work as expected.