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

C++ 在getter方法上应用begin()得到的迭代器不';不允许访问指向列表的第一个元素,c++,pointers,object,iterator,C++,Pointers,Object,Iterator,我有一个带有getter方法的对象指针*myObject: vector<string> getList(); 一切正常 你能帮我理解这个问题吗 谢谢。当您执行此操作时: vector<string>::const_iterator it = myObject->getList().begin(); 然后,只要未销毁myList,迭代器将保持有效。执行此操作时: vector<string>::const_iterator it = myObject

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

vector<string> getList();
一切正常

你能帮我理解这个问题吗

谢谢。

当您执行此操作时:

vector<string>::const_iterator it = myObject->getList().begin();
然后,只要未销毁myList,迭代器将保持有效。

执行此操作时:

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

然后,迭代器保持有效,只要未销毁
myList

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

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

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

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

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

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

cout问题是您返回的是vector的副本,它将超出范围并不存在,因此无效

您要做的是返回对列表的常量引用

const vector<string>& getList();
const vector&getList();

问题在于,如果返回的是vector的副本,它将超出范围和存在范围,因此无效

您要做的是返回对列表的常量引用

const vector<string>& getList();
const vector&getList();
向量getList()返回一个临时的、早就消失了的值。第二个复制该列表,然后迭代该列表。如果列表在您的对象中,并且您不想让人们弄脏它,那么让他们来决定是否复制它,并且只返回常量引用而不是副本。如果它是在
getList()
成员中按需生成的,那么除了执行第二个代码片段,您别无选择返回一个临时的、早就消失了的值。第二个复制该列表,然后迭代该列表。如果列表在您的对象中,并且您不想让人们弄脏它,那么让他们来决定是否复制它,并且只返回常量引用而不是副本。如果它是在
getList()
成员中按需生成的,那么除了执行第二个代码片段,您别无选择。
const vector<string>& getList();