3

我有一个包含向量的类(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 << 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
4

5 回答 5

9
for(vector<random>::iterator it = foo.getVector().begin();

当您这样做时会返回临时向量,并且在因此迭代器在循环内变得无效后遇到foo.getVector()它时会被销毁。;foo.getVector().begin();

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

于 2009-05-13T05:55:16.243 回答
7

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

于 2009-05-13T05:55:00.690 回答
2

getVector() 按值返回向量,在第一种情况下,您会得到一个临时变量,一旦您进入循环,该变量就会被销毁。在第二种情况下,您将结果复制到在循环内仍然存在的局部变量中。可能的解决方案是通过 const 引用返回向量。

于 2009-05-13T05:56:17.880 回答
1

您的错误在 getVector() 方法中。通过引用返回。

class Hits
{
    public:
    std::vector<word_idx_value>&   getVector() {return speech_hits;}
    //                         ^
    //                      Add the & to return by reference.

    // You may also want a const version at some point.
    std::vector<word_idx_value> const&   getVector() const {return speech_hits;}

如果您不通过引用返回,则您正在创建一个临时副本。副本在使用后被销毁。在这种情况下,在 begin() 执行后临时对象被销毁,因此 begin() 返回的迭代器无效。

于 2009-05-13T14:14:35.680 回答
0

修改 getVector 函数以返回对象引用,如下所示: std::vector<word_idx_value>& getVector() {return speech_hits;}

于 2009-05-13T06:20:23.927 回答