当前位置:  开发笔记 > 编程语言 > 正文

pop_back()是否真的使std :: vector上的*all*迭代器无效?

如何解决《pop_back()是否真的使std::vector上的*all*迭代器无效?》经验,为你挑选了2个好方法。

调用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,任何先前最终元素(现在不再存在)的迭代器都将失效.

查看您的代码,问题是当您删除最后一个元素并且列表变为空时,您仍然会增加它并离开列表的末尾.



1> 小智..:

调用pop_back()移除向量中的最后一个元素,因此该元素的迭代器无效.该pop_back()调用并没有最后的元素之前迭代器失效的项目,只有重新分配将这样做.来自Josuttis的"C++标准库参考":

插入或删除元素会使引用,引用和迭代器无效,这些引用,引用和迭代器引用以下元素.如果插入导致重新分配,则会使所有引用,迭代器和指针无效.


cplusplus.com是一个糟糕的网站; 永远不要用它作为参考.
@BruceConnor怎么样[http://www.cppreference.com](http://www.cppreference.com)?

2> 小智..:

以下是您的答案,直接来自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,任何先前最终元素(现在不再存在)的迭代器都将失效.

查看您的代码,问题是当您删除最后一个元素并且列表变为空时,您仍然会增加它并离开列表的末尾.

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有