【发布时间】:2009-05-13 05:23:53
【问题描述】:
我有一个包含向量的类 (foo)。
如果我尝试像这样迭代向量中的元素:
for(vector<random>::iterator it = foo.getVector().begin();
it != foo.getVector().end(); ++it) {
cout << (*it) << endl;
}
第一个元素总是损坏并返回垃圾数据。
但是,如果执行以下操作:
vector<random> v = foo.getVector();
for(vector<random>::iterator it = v.begin();
it != v.end(); ++it) {
cout << (*it) << endl;
}
一切似乎都运行良好。有没有我不知道的“陷阱”?
我也尝试过 cout
谢谢。
编辑:
这是我的头文件:
#ifndef HITS
#define HITS
#include <vector>
#include "wrappers.h"
class Hits {
public:
Hits();
std::vector<word_idx_value> getVector() {return speech_hits;}
const std::vector<word_idx_value> getVector() const {return speech_hits;}
void add(const word_idx_value&);
Hits &operator+=(const Hits&);
private:
std::vector<word_idx_value> speech_hits;
};
#endif
【问题讨论】:
-
我们可以看看你的 getVector() 成员函数吗?也许有什么东西在那里修改了它?
-
什么返回 getVector() ?它是矢量的副本还是对存储在其他地方的现有矢量的引用?
-
我已将其更改为按引用而不是按值返回。它似乎工作正常,但为什么按值传递会对结果产生如此大的影响?
-
因为迭代器的两个边界完全不相关(尽管内容相同)。这就像 char foo[6] = "Hello"; char *bar = malloc(sizeof(char) * 6); strcat(酒吧,富); for(char *p = foo; p
-
应该影响更大。您返回一个副本,您将获得一个迭代器。返回的值(临时)永远不会存储,因此在下一句中将其删除。现在,您正在使用迭代器进入无人区。分段错误可能是第一次访问或第二次访问的结果,或者当循环尝试匹配不同向量的 end() 迭代器时......阅读 GoTW 18:gotw.ca/gotw/018.htm
标签: c++ stl vector iterator cout