iterator,
迭代器是一种遍历容器内元素的数据类型,这种数据类型感觉有点像指针,我们理解的时候就理解为迭代器用来指向容器中的某个元素。
string, vector [],很少用[],更常用的访问方式就是用迭代器(更通用)。
通过迭代器,我们就可以读容器中的元素值,读string中的每个字符,还可以修改某个迭代器所指向的元素值。
类似于++,--等操作
list, map ,尽量学会用迭代器来访问容器中的元素。
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; }