- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图理解 vector 中迭代器失效的概念。从我所做的一些阅读中,我发现如果一个 vector 包含 7 个元素并且你删除了第 5 个索引上的元素,那么从第 5 个元素开始的迭代器将失效。这是因为第 5 个索引之后的所有元素都需要向上移动一个槽位。这对我来说很有意义,但是我对以下两种情况有点困惑
std::vector<foo> vec {foo{1},foo{2}}; //foo is a simple class
foo* ptr = &vec[0]; //Case 1
std::vector<foo>::iterator it = vec.begin() + 1; //Case 2
对于 STL 容器来说,如果迭代器失效,那么指针也会失效,这样说是否安全?例如,如果 it
变得无效,那么 ptr
也会无效吗?如果不能,您能否给出一个迭代器失效但指针仍然有效的情况?我目前对 vectors 、 maps 和 deques 感兴趣。
更新:所以我写了一些代码并进行了实验
std::vector<foo> vec {foo{1},foo{2},foo{3}};
foo* ptr = &vec[1];
std::vector<foo>::iterator it = vec.begin() + 1;
std::cout << "Before : " << ptr->a << "\n";
vec.erase(vec.begin() + 1); //Remove the second element
std::cout << "Iterator value : " << it->a << "\n";
std::cout << "After : " << ptr->a << "\n";
结果是
Before : 2
Iterator value : 3
After : 3
我很惊讶为什么 vector 没有提到迭代器无效,因为这是在删除元素之前获得的迭代器。
最佳答案
当您移除一个项目时,不同的容器会有不同的行为。
来自 http://en.cppreference.com :
Invalidates iterators and references at or after the point of the erase, including the
end()
iterator.
References and iterators to the erased elements are invalidated. Other references and iterators are not affected.
All iterators and references are invalidated, unless the erased elements are at the end or the beginning of the container, in which case only the iterators and references to the erased elements are invalidated.
关于c++ - 如果迭代器在 STL 容器中失效,指针是否失效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32793784/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
以下 C++ 代码和 Makefile 产生了一个无法理解的编译错误(对我来说)。谁能解释一下 问题到底是什么? 修复此代码需要做什么?能举个例子吗? 我在 Cygwin 的 GCC 上成功编译了这段
我大量使用 BOOST_FOREACH 来迭代容器,并且由于我最近转向 c++0x,我认为我可以用基于范围的 替换 BOOST_FOREACH >for 构造。下面这段代码 #include #inc
我编写了代码,允许按照输入的顺序遍历映射数据。 我编写了几次代码的解决方案是: 给定键类型 K 和数据类型 D, 标准:: map std::向量 如果想随机查找数据条目,请使用 map.find(K
我在 cygwin 上使用 gcc 3.4.4。我在下面的代码中收到了这个相当令人费解的 STL 错误消息,它根本不使用 STL: #include using namespace std; con
我正在使用 STL 函数 count_if 来计算所有正值在 double vector 中。例如我的代码是这样的: vector Array(1,1.0) Array.push_back(-1.
我正在尝试使用 numpy-STL 从 STL 模型中提取顶点以用于相干点漂移注册。你如何提取顶点?我了解如何从顶点和面列表创建网格,但不了解如何倒退。 我试过:从顶点和面创建一个新网格。导入创建的网
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.html 根据那篇文章,STL 不适合游戏开发。 你对此有何看法? 我目前的
在幕后,STL 映射是一棵红黑树,它使用其键的 typename _Rb_tree::iterator _Rb_tree:: find(const _Key& __k) { iterator _
我对 C++ 有很好的了解,但从未深入研究 STL。我必须学习 STL 的哪一部分才能提高工作效率并减少工作中的缺陷? 谢谢。 最佳答案 I have good knowledge of C++ 恕我
map rollCallRegister; map :: iterator rollCallRegisterIter; pair , bool> returnPair; rollCallRegi
在查看一些算法的模板名称时, 我看到这个名字对应于一个图书馆的概念。 取std::mismatch例如。 template std::pair mismatch( InputIt1 first1, I
我想对 class Person 的对象数组进行排序基于其数据成员' age '.我将对象存储在 vector v 中. 据我所知,至少有 4 种方法可以执行此操作,根据下面编写的方法,我有以下问题。
我对 gcc 或 Visual Studio 打包之外的 STL 实现感到好奇,因此快速 Google 搜索出现了一些结果,例如: Apache stdcxx uSTL rdeSTL 在什么情况下应该
我可以使用例如std::vector吗?在 macOs/XCode 的 DriverKit 驱动程序中? DriverKit 有一些容器类,如 OSArray https://developer.ap
我找不到任何关于如何将范围与容器结合使用的好文档。我正在尝试使用给定的 .insertAfter() 函数将一个元素插入到 SList 中。它需要一个范围,但我不知道如何检索它。 有人可以发布一两个示
如何在(例如)STL 容器中引入聚合初始化支持以正确构造它们?我的意思是: struct A { int i; char c; }; std::list l; // empty l.insert(st
我有一个 STL map : std::map > my_map; 我有两个变量: string name; int age; 这些变量的值发生变化,但本质上我想要做的是: 如果键名不存在,则创建键名
我是 C++ 的新手,请求帮助解决问题。 我正在编写一个简单的 STL 样式函数,它应该返回序列的中间元素( vector 、列表等) 这是我的函数,我尝试使用迭代器的概念 template It
如果我将几个水果名称推回第一个STL列表,同时,我将每个水果的编号推回第二个STL列表;如果我想按字母顺序对第一个STL列表进行排序,我该如何按水果STL列表的顺序对第二个STL列表进行排序? 最佳答
我是一名优秀的程序员,十分优秀!