我有一个带有getter方法的对象指针*myObject
:
vector<string> getList();
当我创建我的迭代器来运行getList()返回的list变量时,如下所示:
vector<string>::const_iterator it = myObject->getList().begin();
我显示它:
cout << *it << endl;
它没有显示任何内容(当然是一个空字符串)。
它与it+1
,it+2
,it+3
,it+4
类似,但是从it+5
显示正确的元素
然而,当我重写这样的代码时:
vector<string> myList = myObject.getList();
vector<string>::const_iterator it = myList.begin();
cout << *it << endl;
一切正常。
你能帮我理解这个问题吗?
谢谢。
答案 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();