C++笔记 迭代器简单记录

C++ 笔记 迭代器简单记录

基础用法:

#include <vector>
#include <string>
using namespace std;
int main(){
	//常用基本方法
	vector <double> str_test1{10,1.1};
	//定义迭代器
	vector <double>::iterator iter;
	//容器迭代器
	//返回一个begin迭代器 指向第一个元素
	iter = str_test1.begin();
	//指向末端 可以理解为最后一个元素+1
	iter = str_test1.end();
	//需要注意的是如果迭代器里面没有值则begin和end返回类型相同
	return 0;
}

例1:容器基本遍历

#include <vector>
#include <string>
#include <iostream>
using namespace std;
int main(){

	vector <int> str_test1{1,2,3,4,5,6,7,8,9,10};
	for (auto iter = str_test1.begin(); iter != str_test1.end(); iter++) {
		cout << *iter << endl;
	}
	return 0;
}
结果:

在这里插入图片描述

反向迭代:

#include <vector>
#include <string>
#include <iostream>
using namespace std;
int main(){

	vector <int> str_test1{1,2,3,4,5,6,7,8,9,10};
	for (auto iter = str_test1.rbegin(); iter != str_test1.rend(); iter++) {
		cout << *iter << endl;
	}
	return 0;
}

结果:

在这里插入图片描述

注意:不能迭代一个空的容器

#include <vector>
#include <string>
#include <iostream>
using namespace std;
int main(){

	vector <int> str_test1{};
	auto iter = str_test1.begin();
	iter++;
	return 0;
}

或者:当容器已经指向end时就不能继续往后进行运算

#include <vector>
#include <string>
#include <iostream>
using namespace std;
int main(){

	vector <int> str_test1{};
	auto iter = str_test1.end();
	iter++;
	return 0;
}
导致程序发生崩溃或者不可预测的事情:

在这里插入图片描述

迭代器的比较:

在这里插入图片描述
 当迭代器都同时指向同一个位置后则为true否则则为flase。

常量迭代器:

#include <vector>
#include <string>
#include <iostream>
using namespace std;
int main(){

	vector <int> str_test1{1,2,3};
	vector <int>::const_iterator iter;
	iter = str_test1.begin();
	return 0;
}
注意:常量迭代器是无法修改指向本身的内容但是可以修改指向的方向。如下:

在这里插入图片描述

C++11中新引入新方法:cbegin(),cend ()也是返回常量迭代器。

#include <vector>
#include <string>
#include <iostream>
using namespace std;
int main(){

	vector <int> str_test1{1,2,3};
	vector <int>::const_iterator iter;
	iter = str_test1.cbegin();
	iter = str_test1.cend ();
	return 0;
}

迭代器中经典灾难场景:

场景1:
#include <vector>
#include <string>
#include <iostream>
using namespace std;
int main(){

	vector <int> str_test1{1,2,3};
	for (auto itme : str_test1) {
		str_test1.push_back(1);
		cout << itme << endl;
	}
	return 0;
}

 当在迭代过程中同时又往里添加新的元素导致里面的元素都发生意想不到的情况。
在这里插入图片描述

场景2:
#include <vector>
#include <string>
#include <iostream>
using namespace std;
int main(){

	vector <int> str_test1{1,2,3};
	for (auto itme = str_test1.begin(), end=str_test1.end(); itme!=end;itme++){
		str_test1.push_back(1);
		cout << *itme << endl;
	}
	return 0;
}

 也是在迭代过程中同时又往里添加新的元素,这次程序直接崩溃。

小结:在使用迭代器尤其是这种循环结构时是不能修改容器中的大小,否则会导致程序出现问题。非要使用这种写法请在修改后直接break。如图:

在这里插入图片描述

场景3:
#include <vector>
#include <string>
#include <iostream>
using namespace std;
int main(){

	vector <int> str_test1{1,2,3};
	int count = 0;
	auto itme = str_test1.begin();
	while (itme != str_test1.end())
	{
		itme = str_test1.insert(itme,count);
		count++;
		if (count > 10)
			break;
		itme++;
	}
	cout << str_test1.size() << endl;
	return 0;
}

 如果必须迭代的同时并且修改容易的大小,需要对所有的迭代器位置进行动态刷新,否则还是会让迭代器失效。
在这里插入图片描述

场景4:在迭代中删除元素
#include <vector>
#include <string>
#include <iostream>
using namespace std;
int main(){
	vector <int> str_test1{1,2,3};
	int count = 0;
	for (auto itme = str_test1.end(); itme != str_test1.begin();itme--) {
		str_test1.erase(itme);
	}
	return 0;
}

在这里插入图片描述

解决办法:

 在修改过程中需要动态刷新。

#include <vector>
#include <string>
#include <iostream>
using namespace std;
int main(){
	vector <int> str_test1{1,2,3};
	int count = 0;
	
	while (!str_test1.empty())
	{
		auto itme = str_test1.begin();
		str_test1.erase(itme);
	}
	return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值