C++:向量"腐败"的第一个元素

Joh*_*ang 3 c++ iterator stl cout vector

我有一个包含向量的类(foo).

如果我尝试迭代向量中的元素,如下所示:

for(vector<random>::iterator it = foo.getVector().begin();
        it != foo.getVector().end(); ++it) {
  cout << (*it) << endl;

}
Run Code Online (Sandbox Code Playgroud)

第一个元素总是被破坏并返回垃圾数据.

但是,如果做的事情如下:

 vector<random> v = foo.getVector();
 for(vector<random>::iterator it = v.begin();
            it != v.end(); ++it) {
      cout << (*it) << endl;

 }
Run Code Online (Sandbox Code Playgroud)

一切似乎都很好.有一个我不知道的"陷阱"吗?

我也尝试过做cout << foo.getVector()[0] << endl; 循环之外,但似乎工作正常.

谢谢.

编辑:

这是我的头文件:

#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
Run Code Online (Sandbox Code Playgroud)

aJ.*_*aJ. 9

for(vector<random>::iterator it = foo.getVector().begin();
Run Code Online (Sandbox Code Playgroud)

当你执行foo.getVector()它时会返回临时向量,并且在循环中因此迭代器变得无效;之后会遇到它foo.getVector().begin();.

如果存储foo.getVector();向量v(v = foo.getVector();)的值, 然后使用向量v,它可以正常工作.这是因为向量v在整个循环中是有效的.


小智 7

getVector()按值返回向量.getVector的两次调用(begin()和end())返回向量的不同副本,因此您在一个对象上调用begin()而在另一个对象上调用end().你得到的是两个不同容器中的两个迭代器.将这两个迭代器与!=进行比较会产生一个未定义的值.