通过在getter方法上应用begin()得到的迭代器不允许访问指向列表的第一个元素

时间:2014-04-26 12:53:18

标签: c++ pointers object iterator

我有一个带有getter方法的对象指针*myObject

vector<string> getList();

当我创建我的迭代器来运行getList()返回的list变量时,如下所示:

vector<string>::const_iterator it = myObject->getList().begin();

我显示它:

cout << *it << endl;

它没有显示任何内容(当然是一个空字符串)。 它与it+1it+2it+3it+4类似,但是从it+5显示正确的元素

然而,当我重写这样的代码时:

vector<string> myList = myObject.getList();
vector<string>::const_iterator it = myList.begin();
cout << *it << endl;

一切正常。

你能帮我理解这个问题吗?

谢谢。

3 个答案:

答案 0 :(得分:3)

执行此操作时:

vector<string>::const_iterator it = myObject->getList().begin();

在该行的末尾,迭代器it无效,因为vector<string>返回的getList()是临时值。

但是,当您使用

vector<string>存储在本地变量中时
vector<string> myList = myObject.getList();

然后,只要myList没有被销毁,迭代器就会保持有效。

答案 1 :(得分:1)

在第一种情况下,代码具有未定义的行为,因为函数std::vector<std::string>返回的类型myObject.getList()的临时对象将在执行语句的末尾删除。因此迭代器将无效。

除了第二个例子中的有效代码,您还可以编写

const vector<string> &myList = myObject.getList();
vector<string>::const_iterator it = myList.begin();
cout << *it << endl;

即你可以使用对临时对象的常量引用。

答案 2 :(得分:0)

问题是你要返回一个向量的副本,它会超出范围并且不存在,因此无效。

您要做的是将const引用返回到列表中。

const vector<string>& getList();