一:迭代器简介
iterator,
迭代器是一种遍历容器内元素的数据类型,这种数据类型感觉有点像指针,我们理解的时候就理解为迭代器用来指向容器中的某个元素。
string, vector [],很少用[],更常用的访问方式就是用迭代器(更通用)。
通过迭代器,我们就可以读容器中的元素值,读string中的每个字符,还可以修改某个迭代器所指向的元素值。
类似于++,--等操作
list, map ,尽量学会用迭代器来访问容器中的元素。
二:const迭代器
const_iterator 表示该迭代器指向的元素的值不能改变,该迭代器可以改变,该迭代器可以不断地指向容器中的下一个元素。就类似const char *.
int main()
{
vector<int> vint = { 100,200,300 };
vector<int>::const_iterator iter;//定义一个const_iterator
for (iter = vint.begin(); iter != vint.end(); ++iter)
{
*iter = 10;//不可以
cout << *iter << endl;//可以
}
return 0;
}
cbegin() 与cend():
vector的成员函数,不管该容器是否是常量容器,这两个函数返回的都是常量迭代器。
三、迭代器失效
迭代器失效的演示程序1:
int main()
{
vector<int> vecvalue{ 1,2,3,4,5 };
auto beg = vecvalue.begin();
auto end = vecvalue.end();
while (beg != end)
{
vecvalue.insert(beg, 10);//在beg这个位置插入元素 10
//break;
++beg;
}//这段代码会导致程序崩溃,因为在容器中删除/插入新的元素后,迭代器就已经失效了,
//容器实际的begin和end位置就该变了。但是while循环的判断条件没有变,所以在插入一个元素后break
return 0;
}
正确的往容器中使用迭代器Insert数据,演示程序:
int main()
{
vector<int> vecvalue{ 1,2,3,4,5 };
int count = 0;
auto beg = vecvalue.begin();
while (beg != vecvalue.end())
{
beg = vecvalue.insert(beg, 10 + count);//insert返回的结果保存给beg
count++;
if (count > 10)
{
break;//插入10个结束循环
}
++beg;
}
for (beg = vecvalue.begin(); beg != vecvalue.end(); beg++)
{
cout << *beg << endl;
}
return 0;
}
迭代器失效的演示程序2:
int main()
{
vector<int> iv{ 100,200,300 };
//.......
//在程序执行到最后,要退出时
for (auto iter = iv.begin(); iter != iv.end(); iter++)
{
iv.erase(iter);//erase函数,一处iter位置上的元素,返回下一个位置
}
return 0;
}
在程序运行后崩溃,因为迭代器失效了。这里要保存erase函数返回的位置。所以可以这样写:
int main()
{
vector<int> iv{ 100,200,300 };
//.......
//在程序执行到最后,要退出时
vector<int>::iterator iter = iv.begin();
while (iter != iv.end())
{
iter = iv.erase(iter);
}
for (auto beg = iv.begin(); beg != iv.end(); beg++)
{
cout << *beg << endl;
}
return 0;
}