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

Posted wuyi_all_in

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中容器的迭代器用法与实战相关的知识,希望对你有一定的参考价值。


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

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

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

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

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()     返回一个反向迭代器,指向容器中第一个元素的后一个不存在的元素,起到一个结束标记的作用 

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

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;

 

 

 

以上是关于C++中容器的迭代器用法与实战的主要内容,如果未能解决你的问题,请参考以下文章

C++迭代器 iterator

C++初阶第十一篇——list(list常见接口的用法与介绍+list的模拟实现+list迭代器原理)

c++之iostream迭代器用法超详细整理!!!

《深入实践C++模板编程》之五——容器与迭代器

容器迭代器

C++ STL与迭代器