C++中容器的迭代器用法与实战
虽然string , vector容器可以用下标访问,但是很多其他的容器不行,但是所有容器都配有迭代器,要善于用迭代器访问容器
begin() 返回一个迭代器类型,指向容器中第一个元素end() 返回一个迭代器类型,指向容器中最后一个元素的后一个不存在的元素,起到一个结束标记的作用
vector iv={100,200,300};vector::iterator iter; //定义一个迭代器,迭代器的类型必须是vectoriter=iv.begin();iter=iv.end();
如果一个容器为空,返回的收尾迭代器相等
vector iv2;vector::iterator iterbegin = iv2.begin();vector::iterator iterend = iv2.end();if(iterbegin=iterend){ cout<<"容器iv2为空"<利用正向迭代器遍历容器
vector iv={100,200,300};//遍历一个容器,输出值for(vector::iterator iter=iv.begin();iter != iv.end(); iter++){ cout<< *iter <利用反向迭代器从后向左遍历容器,对于单向链表不适用rbegin() 返回一个反向迭代器,指向容器中最后一个元素rend() 返回一个反向迭代器,指向容器中第一个元素的后一个不存在的元素,起到一个结束标记的作用
vector iv={100,200,300};//从后遍历一个容器,输出值for(vector::reverse_iterator riter=iv.rbegin();iter != iv.rend(); riter++){ cout<< *riter <迭代器的运算符:*iter 指向iter迭代器的引用iter++和++iter 让迭代器指向容器中的下一个元素,但已经指向end()时不能再++iter--和 --iter 让迭代器指向容器的上一个元素,但已经指向begin()时不能再--iter1 == iter2 iter != iter2 判断迭代器是否指向同一个元素 指向结构体类型的迭代器
struct student{ int num;};student mystu;mystu.num=10;vector sv;sv.push_back(mystu);vector:: iterator iter=sv.begin();//两种写法,都可以输出对应的结构体成员值 *iter 相当于指向第一个结构体变量cout << (*iter).num <num <const_iterator 表示不能通过该迭代器改变容器中该迭代器指向的值,iterator 可读可写cbegin() cend() 返回的是常量迭代器迭代器失效:往一个容器中添加或者删除元素,可能会将容器元素的指针、引用、迭代器失效。范围for循环内部实现基于迭代器,所以范围for中也不能随意的增加或者删除元素可以通过增加元素后立刻break,或者每次重新刷新迭代器的值erase() 移除位置上的元素,返回下一个元素的位置
vector iv={1,2,3};vector :: 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 #include#include#includeusing namespace std;struct conf { char itemname[40]; char itemcontent[100];};char * get_char(vector&record, char * itemname){ //for (auto stu : record) //{ // if (_stricmp(stu->itemname , itemname)==0) // return stu->itemcontent; // //} for (vector::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::iterator iter = record.begin(); iter != record.end(); iter++) //{ // delete *iter; //} for (auto stu : record) delete stu; cout << get_char(record, "YIOOIP") << endl; return 0;}
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
暂时没有评论,来抢沙发吧~