c++之迭代器

简介

迭代器是一种遍历容器内元素数据类型,感觉像指针,可理解成指向容器中的某个元素;

迭代器类型
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
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天未及海宽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值