c++之迭代器
简介迭代器是一种遍历容器内元素数据类型,感觉像指针,可理解成指向容器中的某个元素;迭代器类型1. 普通迭代器(1) begin() 返回一个迭代器类型,指向开始元素;vector<int> iv{1,2,3};vector<int>::iterator iterb = iv.begin();//若容器不为空,相当于iter指向了iv[0];(2) end() 返回一个迭代器
·
简介
迭代器是一种遍历容器内元素数据类型,感觉像指针,可理解成指向容器中的某个元素;
迭代器类型
1. 普通迭代器
(1) begin() 返回一个迭代器类型,指向开始元素;
vector<int> iv{1,2,3};
vector<int>::iterator iterb = iv.begin();//若容器不为空,相当于iter指向了iv[0];
(2) end() 返回一个迭代器类型,指向元素末尾后一个位置;
vector<int> iv{1,2,3};
vector<int>::iterator itere = iv.end();
//end()返回的迭代器指向并不是末端元素,而是指向末端元素后面一个位置,可理解成end()指向一个不存在的元素;
(3) 若一个容器为空,那么begin()和end()返回的迭代器相同;
vector<int> ive2;
vector<int>::iterator ive2b = ive2.begin();
vector<int>::iterator ive2e = ive2.end();
if(ive2b == ive2e){
cout << "容器为空" << endl;
}
2. 反向迭代器
从后往前遍历一个容器,那么反向迭代器用起来比较方便;
反向迭代器,用的是rbegin()和rend(); 其中r表示reverse:转置,反向;
rbegin()返回一个反向迭代器,指向反向迭代器的第一个元素;
rend()返回一个反向迭代器,指向反向迭代器的最后一个元素的下一个位置;
vector<int> iv = {1,2,3,4};
for(vecotr<int>::reverse_iterator riter = iv.rbegin(); iter != iv.rend(),riter++){
cout << *iter << endl;
}
3.常量迭代器
const_iterator迭代器,表示这个迭代器指向的元素值不能改变,而不是迭代器本身不可变;
只能从容器中读元素,不能通过这个迭代器改写容器中的元素;感觉起来更像常量指针;
const vector<int> iv = {1,2,3,4};
vector<int>::const_iterator iter;
for(iter = iv.begin(); iter != iv.end(); iter++){
//*iter = 4;//只读迭代器不能改变值
cout << *iter << endl;//读可以
}
c++11引入新函数, cbegin()和cend();返回的都是常量迭代器;
for(auto iter = iv.cbegin(); iter != iv.cend(); iter++){
//*iter = 1;//错误
}
4. 常量反向迭代器
带有const属性的反向迭代器;
vector<int> iv{ 1,2,3,4 };
vector<int>::const_reverse_iterator iter;
for (iter = iv.rbegin(); iter != iv.rend(); iter++){
//*iter = 1;
cout << *iter << endl;
}
//============================
for (auto iter = iv.crbegin(); iter != iv.crend(); iter++) {
//*iter = 2;
cout << *iter << endl;
}
5. 迭代器失效
在遍历容器时,往容器中增加或删除元素可能会使指向该容器的指针,引用,迭代器失效;
(1) push_back函数
vector<int> iv{ 1,2,3,4 };
for (auto iter = iv.begin(); iter != iv.end(); iter++) {
//iv.push_back(12);//往容器中增加元素导致迭代器失效;
cout << *iter << endl;
}
改进:
for (auto iter = iv.begin(); iter != iv.end(); iter++) {
iv.push_back(12);
break;//立即退出
cout << *iter << endl;
}
(2) insert函数
vector<int> iv{ 1,2,3,4 };
auto beg = iv.begin();
auto end = iv.end();
while (beg != end)
{
/*在beg位置处插入9,肯定会导致迭代器失效,如begin,end失效,具体哪一个失效,取决于内部实现元素;*/
iv.insert(beg, 9);
break;//插入新数据立即退出,最明智的选择;
}
//然后在做其他事;
改进
vector<int> iv{ 1,2,3,4 };
auto beg = iv.begin();
int cout = 0;
while (beg != iv.end()) //每次更新end()防止end迭代器失效;
{
beg = iv.insert(beg, cout+9);//insert返回值我要接着,不断更新begin();
if (cout > 10)
break;
++cout ;
}
//然后在做其他事;
(3) erase函数
vector<int> iv{ 1,2,3,4 };
for (auto iter = iv.begin(); iter != iv.end(); iter++) {
//erase函数,移除Iter位置上的元素,返回下一个元素位置;
//iv.erase(iter);//错误代码
}
改进
vector<int>::iterator iter = iv.begin();
while (iter != iv.end()) //end()在不断更新、
{
iter = iv.erase(iter);
}
暴力版本:
while (!iv.empty())
{
auto iter = iv.begin();//由于不为空,所以begin()上的元素不为空;
iv.erase(iter);
}
更多推荐
已为社区贡献1条内容
所有评论(0)