…
iterator
n. 迭代器;迭代程序
(有道翻译)
…
用法
…
初始化
vector<int> iv = { 100, 200, 300 };
vector<int>::iterator iter; //定义迭代器, 类型同样为vector<int>
begin()/end()和rbegin()/rend()
用于返回迭代类型
iter = iv.begin(); //如果容器中有元素, 指向容器中的第一个元素
iter = iv.end(); //end返回的迭代器指向的并不是末端元素,而是末端元素的后面, end()指向一个不存在的元素
//如果容器为空, 那么begin()和end()返回的迭代器就相同
//end()可以作为结束标记,如果begin()遍历到最后与end()相等,那么可以确定遍历结束
反向迭代器
reverse_iterator
n. 逆向;相反;背面;
vector<int>::reverse_iterator riter;
for遍历方式
for (iter = iv.begin(); iter != iv.end(); iter++)
{
cout << *iter << endl;
}
//反向迭代器
for (vector<int>::reverse_iterator riter = iv.rbegin(); riter != iv.rend(); riter++)
{
cout << *riter << endl;
}
//输出
/*100
200
300
300
200
100*/
迭代器运算符
a) *iter: 返回迭代器iter锁指向的元素的引用,必须保证迭代器指向的是有效的元素
b) iter++; ++iter:让迭代器指向容器中的下一个元素
c) iter–; --iter: 指向上一个元素
d) 结构成员引用示例
struct student{
int num = 0;
};
vector<student> sv;
student mystu;
mystu.num = 100;
sv.push_back(mystu);
vector<student>::iterator iter;
iter = sv.begin();
cout << (*iter).num << endl; //100
cout << iter->num << endl; //100
const_iterator
常量迭代器,同上,只读不可写
cbegin 和 cend
C11引入的两个新函数,与begin和end类似,不管容器是否是常量容器,cbegin,cend都是常量迭代器
vector<int> iv = {100, 200, 300};
for(auto iter = iv.cbegin(); iter != cend(); ++iter)
{
*iter = 50; //错误, 不能给常量赋值
cout << *iter << endl;
}
迭代器失效
在操作迭代器的过程中,使用迭代器这种循环体,不要改变vector的容量, 也就是不要增加或者删除vector容器中的元素.
for (auto beg = iv.begin(), end = iv.end(); beg != end; ++beg)
{
//iv.push_back(111); //执行会报错
cout << *beg << endl;
}
vector<int> iv = {100, 200, 300};
vector<int>::iterator iter;
for (auto iter = iv.begin(); iter != iv.end(); iter++)
{
iv.erase(iter); //erase函数, 移除iter位置上的元素, 返回下一个元素的位置
//错误,迭代器失效
}