Luc*_*uca 0 c++ containers iterator stl
我正在学习C++,我正在阅读有关STL容器,迭代器以及可以对它们执行的操作的内容.我知道每个容器类型(或者更好,每个类型都是实例的相应模板)定义了一个类似于指针类型的companio类型,它被称为迭代器.我理解的是,一旦你得到一个容器的迭代器,执行像添加元素之类的操作可能会使该迭代器失效,所以我尝试用一个例子来测试这个语句:
#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<<" ";
}
Run Code Online (Sandbox Code Playgroud)
在这里,我只是构建一个int向量,大括号初始化它,并执行基于条件的操作,在容器的前半部分插入一个元素.该代码是有缺陷的,我认为,因为我初始化2个迭代器对象beg
和end,然后我在while语句作为条件使用它们.但是,如果代码应该更改容器的内容(并且确实如此)迭代器会发生什么?代码似乎运行得很好,它在ivec [1]位置添加0并打印结果.
我认为beg迭代器会指向新添加的元素,mid迭代器会指向前面指向mid的元素(就像迭代器指向相同的内存位置而底层数组"滑动")在..除非它被重新分配,是)
有人能解释我这种行为吗?
当标准说迭代器失效,这并不能保证他们会在防止您的程序不能正常工作的意义无效.使用无效的迭代器是未定义的行为,这是C++中一个非常重要的主题.这并不意味着你的程序会崩溃,但它可能会崩溃.您的程序可能还会执行其他操作 - 行为完全未定义.
| 归档时间: |
|
| 查看次数: |
85 次 |
| 最近记录: |