C++中容器的迭代器用法与实战
Posted wuyi_all_in
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
以上是关于C++中容器的迭代器用法与实战的主要内容,如果未能解决你的问题,请参考以下文章