C++中容器的迭代器用法与实战

虽然string , vector容器可以用下标访问,但是很多其他的容器不行,但是所有容器都配有迭代器,要善于用迭代器访问容器

begin()  返回一个迭代器类型,指向容器中第一个元素

end()     返回一个迭代器类型,指向容器中最后一个元素的后一个不存在的元素,起到一个结束标记的作用 

vector<int> iv={100,200,300};

vector<int>::iterator iter; //定义一个迭代器,迭代器的类型必须是vector<int>

iter=iv.begin();
iter=iv.end();

如果一个容器为空,返回的收尾迭代器相等

vector<int> iv2;
vector<int>::iterator iterbegin = iv2.begin();
vector<int>::iterator iterend = iv2.end();
if(iterbegin=iterend)
{
    cout<<"容器iv2为空"<<endl;
}

利用正向迭代器遍历容器

vector<int> iv={100,200,300};
//遍历一个容器,输出值
for(vector<int>::iterator iter=iv.begin();iter != iv.end(); iter++)
{
    cout<< *iter <<endl;
}

利用反向迭代器从后向左遍历容器,对于单向链表不适用

rbegin()  返回一个反向迭代器,指向容器中最后一个元素

rend()     返回一个反向迭代器,指向容器中第一个元素的后一个不存在的元素,起到一个结束标记的作用 

vector<int> iv={100,200,300};
//从后遍历一个容器,输出值
for(vector<int>::reverse_iterator riter=iv.rbegin();iter != iv.rend(); riter++)
{
    cout<< *riter <<endl;
}

迭代器的运算符:

*iter   指向iter迭代器的引用

iter++和++iter  让迭代器指向容器中的下一个元素,但已经指向end()时不能再++

iter--和 --iter   让迭代器指向容器的上一个元素,但已经指向begin()时不能再--

iter1 == iter2    iter != iter2 判断迭代器是否指向同一个元素

 

 指向结构体类型的迭代器

struct student
{
    int num;
};
student mystu;
mystu.num=10;

vector<student> sv;
sv.push_back(mystu);

vector<student>:: iterator iter=sv.begin();

//两种写法,都可以输出对应的结构体成员值 *iter  相当于指向第一个结构体变量
cout << (*iter).num <<endl;
cout << iter->num <<endl;

const_iterator   表示不能通过该迭代器改变容器中该迭代器指向的值,

iterator  可读可写

cbegin()   cend()   返回的是常量迭代器

迭代器失效:

往一个容器中添加或者删除元素,可能会将容器元素的指针、引用、迭代器失效。

范围for循环内部实现基于迭代器,所以范围for中也不能随意的增加或者删除元素

可以通过增加元素后立刻break,或者每次重新刷新迭代器的值

erase()  移除位置上的元素,返回下一个元素的位置 

vector<int> iv={1,2,3};
vector<int> :: iterator iter = iv.begin();

while( iter != iv.end() )
{
// 使得iter 每一次指向删除的下一个位置
    iter=iv.erase(iter);
}

while(!iv.empty())
{
    auto iter=iv.begin(); //因为不为空,begin()没有问题
    iv.erase(iter); // 删除iter位置上的数据
}

 实战

gcc或者g++是编译不了strcpy_s的

#include <iostream>
#include<string.h>
#include<cstring>
#include<vector>
using namespace std;

struct conf {
	char itemname[40];
	char itemcontent[100];
};

char * get_char(vector<conf *>&record,  char * itemname)
{
	//for (auto stu : record)
	//{
	//	if (_stricmp(stu->itemname , itemname)==0)
	//		return stu->itemcontent;
	//	
	//}

	for (vector<conf *>::iterator iter = record.begin(); iter != record.end(); iter++)
	{
		//判断字符串是否相等
		if (_stricmp((*iter)->itemname , itemname)==0)
			return (*iter)->itemcontent;
	}
	return nullptr;
}
int main()
{
	conf *stu1 = new conf;
	conf *stu2 = new conf;

	strcpy_s(stu1->itemname, sizeof(stu1->itemname), "1234wu");
	strcpy_s(stu1->itemcontent, sizeof(stu1->itemcontent), "1区");

	strcpy_s(stu2->itemname, sizeof(stu2->itemname), "YIOOIP");
	strcpy_s(stu2->itemcontent, sizeof(stu2->itemcontent), "2区");

	vector< conf *> record;
	record.push_back(stu1);
	record.push_back(stu2);
	
	cout << get_char(record, "1234wu") << endl;

	//释放向量中的指针内存,并非给容器添加或者减少元素,所以迭代器不会失效
	//for (vector<conf *>::iterator iter = record.begin(); iter != record.end(); iter++)
	//{
	//	delete *iter;
	//}
	for (auto stu : record)
		delete stu;
	cout << get_char(record, "YIOOIP") << endl;
	return 0;
}

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值