调用pop_back()
移除向量中的最后一个元素,因此该元素的迭代器无效.该pop_back()
调用并没有最后的元素之前迭代器失效的项目,只有重新分配将这样做.来自Josuttis的"C++标准库参考":
插入或删除元素会使引用,引用和迭代器无效,这些引用,引用和迭代器引用以下元素.如果插入导致重新分配,则会使所有引用,迭代器和指针无效.
cplusplus.com是一个糟糕的网站; 永远不要用它作为参考. (5认同)
@BruceConnor怎么样[http://www.cppreference.com](http://www.cppreference.com)? (2认同)
小智.. 12
以下是您的答案,直接来自The Holy Standard:
23.2.4.2载体满足容器和可逆容器的所有要求(在23.1中的两个表中给出)和序列,包括大多数可选的序列要求(23.1.1).
23.1.1.12表68 expressiona.pop_back()返回typevoid操作语义a.erase( - a.end()) containervector,list,deque
请注意,a.pop_back等同于a.erase( - a.end()).看看矢量的擦除细节:
23.2.4.3.3 - 迭代器擦除(迭代器位置) - 效果 - 在擦除点之后使所有迭代器和引用无效
因此,一旦调用pop_back,任何先前最终元素(现在不再存在)的迭代器都将失效.
查看您的代码,问题是当您删除最后一个元素并且列表变为空时,您仍然会增加它并离开列表的末尾.
调用pop_back()
移除向量中的最后一个元素,因此该元素的迭代器无效.该pop_back()
调用并没有最后的元素之前迭代器失效的项目,只有重新分配将这样做.来自Josuttis的"C++标准库参考":
插入或删除元素会使引用,引用和迭代器无效,这些引用,引用和迭代器引用以下元素.如果插入导致重新分配,则会使所有引用,迭代器和指针无效.
以下是您的答案,直接来自The Holy Standard:
23.2.4.2载体满足容器和可逆容器的所有要求(在23.1中的两个表中给出)和序列,包括大多数可选的序列要求(23.1.1).
23.1.1.12表68 expressiona.pop_back()返回typevoid操作语义a.erase( - a.end()) containervector,list,deque
请注意,a.pop_back等同于a.erase( - a.end()).看看矢量的擦除细节:
23.2.4.3.3 - 迭代器擦除(迭代器位置) - 效果 - 在擦除点之后使所有迭代器和引用无效
因此,一旦调用pop_back,任何先前最终元素(现在不再存在)的迭代器都将失效.
查看您的代码,问题是当您删除最后一个元素并且列表变为空时,您仍然会增加它并离开列表的末尾.