容器迭代器和对容器的操作
container iterators and operations on containers
我正在学习c++,我正在阅读有关STL容器,迭代器以及可以在其上执行的操作。我知道每个容器类型(或者更好地说,每个类型都是其实例的相应模板)都定义了一个类似指针类型的同伴类型,它被称为迭代器。我所理解的是,一旦你得到了一个容器的迭代器,执行像添加元素这样的操作可能会使该迭代器失效,所以我试着用一个例子来测试这个语句:
#include <vector>
#include <iostream>
using namespace std;
int main()
{
vector<int> ivec={1,2,3,4,5,6,7,8,9,0};
auto beg=ivec.begin();
auto mid=ivec.begin()+ivec.size()/2;
while (beg != mid) {
if (*beg==2)
ivec.insert(beg,0);
++beg;
}
for (auto i:ivec)
cout<<i<<" ";
}
在中,我只是构造了一个int型向量,对其进行大括号初始化,然后执行一个基于条件的操作,在容器的前半部分插入一个元素。我认为代码有缺陷,因为我初始化了两个迭代器对象beg
和end
,然后在while语句中使用它们作为条件。但是,如果代码应该改变容器的内容(它确实改变了),迭代器会发生什么?代码似乎运行得很好,它在ivec[1]位置添加了一个0并打印结果。
我认为beg
迭代器将指向新添加的元素,而mid
迭代器将指向先前由mid指向的元素之前的元素(这就像迭代器指向相同的内存位置,而底层数组"滑动"在…除非它被重新分配(即)
当标准说迭代器无效时,这并不能保证它们在阻止程序工作的意义上将是无效的。使用无效迭代器是未定义行为,这是c++中一个巨大而重要的主题。这并不意味着你的程序会崩溃,但确实有可能。您的程序可能还会做一些其他的事情——行为是完全未定义的。
相关文章:
- 迭代器的指针操作问题
- 标准上的 OMP 和并行操作::set<...>::迭代器
- 如何让迭代器使用赋值运算符对列表进行操作
- 将迭代器放置为临时范围时,非销钉 - 操作和错误
- STD ::向量迭代器类型和允许的操作
- 这个迭代器操作在 C++ 中是未定义的吗?
- C++:为什么输出迭代器不支持比较操作?
- 使用迭代器执行对象操作的函数
- std::反向使用反向迭代器,为什么不是无操作?
- C 迭代器操作未检查溢出
- C++列表迭代器如果列表更改则重新启动操作
- std::set::迭代器和std::set::const_iterator之间是否存在操作差异
- 单元测试时操作迭代器
- boost::精神访问从语义操作定位迭代器
- std::sort 如何仅使用迭代器实现交换操作
- 是否允许抛出标准迭代器操作
- C++映射键/迭代器操作
- c++中迭代器上的操作
- 迭代器操作不起作用
- 操作迭代器列表+指针