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

iterator got by applying begin() on getter method doesn't allow to access to first elements of pointed list

本文关键字:访问 不允许 迭代器 元素 第一个 列表 方法 getter 应用 begin      更新时间:2023-10-16

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

vector<string> getList();

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

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;

一切正常。

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

谢谢。

执行此操作时:

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

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

但是,当您使用将vector<string>存储在本地变量中时

vector<string> myList = myObject.getList();

然后,只要myList没有被破坏,迭代器就保持有效。

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

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

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

也就是说,您可以使用对临时对象的常量引用。

问题是,您正在返回向量的副本,它将超出范围且不存在,因此无效。

您想要做的是返回一个对列表的const引用。

const vector<string>& getList();