容器迭代器和容器操作
container iterators and operations on containers
我正在学习 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<<" ";
}
在这里,我只是构造一个整数向量,用大括号对其进行初始化,并执行基于条件的操作,在容器的前半部分插入一个元素。
我认为代码有缺陷,因为我正在初始化两个迭代器对象 beg
和 end
然后我在 while 语句中使用它们作为条件。
但是,如果代码应该更改容器的内容(它肯定会更改)迭代器会发生什么?
代码似乎运行就好了,它在ivec[1]位置添加一个0并打印结果。
我认为 beg
迭代器会指向新添加的元素,而 mid
迭代器会指向之前由 mid 指向的元素(就像迭代器指向相同的内存位置,而底层数组 "slides" 在..下,除非它被重新分配)
谁能给我解释一下这种行为??
当标准说迭代器无效时,这并不能保证它们 将 在阻止程序运行的意义上是无效的。使用无效的迭代器是 未定义的行为,这是 C++ 中一个巨大而重要的话题。这并不意味着您的程序会崩溃,但它可能会崩溃。您的程序可能还会执行其他操作——行为完全未定义。
我正在学习 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<<" ";
}
在这里,我只是构造一个整数向量,用大括号对其进行初始化,并执行基于条件的操作,在容器的前半部分插入一个元素。
我认为代码有缺陷,因为我正在初始化两个迭代器对象 beg
和 end
然后我在 while 语句中使用它们作为条件。
但是,如果代码应该更改容器的内容(它肯定会更改)迭代器会发生什么?
代码似乎运行就好了,它在ivec[1]位置添加一个0并打印结果。
我认为 beg
迭代器会指向新添加的元素,而 mid
迭代器会指向之前由 mid 指向的元素(就像迭代器指向相同的内存位置,而底层数组 "slides" 在..下,除非它被重新分配)
谁能给我解释一下这种行为??
当标准说迭代器无效时,这并不能保证它们 将 在阻止程序运行的意义上是无效的。使用无效的迭代器是 未定义的行为,这是 C++ 中一个巨大而重要的话题。这并不意味着您的程序会崩溃,但它可能会崩溃。您的程序可能还会执行其他操作——行为完全未定义。