C STL 迭代器详解1. 迭代器概述迭代器是STL中提供的一种访问容器元素的通用方法它类似于指针可以遍历容器中的所有元素。迭代器在容器和算法之间起到了桥梁作用。2. 迭代器分类2.1 输入迭代器 (Input Iterator)只读访问单向移动示例istream_iterator2.2 输出迭代器 (Output Iterator)只写访问单向移动示例ostream_iterator2.3 前向迭代器 (Forward Iterator)读写访问单向移动示例forward_list的迭代器2.4 双向迭代器 (Bidirectional Iterator)读写访问双向移动示例list,set,map的迭代器2.5 随机访问迭代器 (Random Access Iterator)读写访问随机访问示例vector,deque,array的迭代器3. 基本迭代器操作3.1 获取迭代器vectorintv{1,2,3};autobeginv.begin();// 指向第一个元素autoendv.end();// 指向最后一个元素的下一个位置3.2 迭代器遍历for(autoitv.begin();it!v.end();it){cout*it ;}3.3 反向迭代器for(autoritv.rbegin();rit!v.rend();rit){cout*rit ;// 反向输出}4. 迭代器适配器4.1 插入迭代器vectorintv;back_insert_iteratorvectorintback_it(v);// 尾部插入*back_it1;// 等价于 v.push_back(1)front_insert_iteratorvectorintfront_it(v);// 头部插入(仅适用于list/deque)*front_it0;// 等价于 v.push_front(0)insert_iteratorvectorintinsert_it(v,v.begin()1);// 指定位置插入*insert_it5;// 在第二个位置插入54.2 流迭代器// 输入流迭代器istream_iteratorintinput_it(cin);istream_iteratorinteof;// 结束标志while(input_it!eof){v.push_back(*input_it);}// 输出流迭代器ostream_iteratorintoutput_it(cout, );copy(v.begin(),v.end(),output_it);// 输出所有元素4.3 移动迭代器vectorstringv{a,b,c};vectorstringv2(make_move_iterator(v.begin()),make_move_iterator(v.end()));// v中的元素被移动到v2v现在包含不确定状态的值5. 迭代器与算法5.1find()autoitfind(v.begin(),v.end(),3);if(it!v.end()){coutFound at position: distance(v.begin(),it);}5.2sort()sort(v.begin(),v.end());// 排序整个vectorsort(v.begin(),v.begin()3);// 只排序前3个元素5.3copy()vectorintv2(v.size());copy(v.begin(),v.end(),v2.begin());// 复制元素6. 迭代器特性6.1iterator_traitstypedefiterator_traitsvectorint::iterator::value_type ValueType;ValueType x10;// x的类型是int6.2 距离计算autodistdistance(v.begin(),v.end());// 计算元素数量7. 完整示例#includeiostream#includevector#includelist#includealgorithm#includeiteratorusingnamespacestd;intmain(){// 1. 基本迭代器使用vectorintv{3,1,4,1,5,9,2,6};coutOriginal vector: ;for(autoitv.begin();it!v.end();it){cout*it ;}coutendl;// 2. 使用算法和迭代器sort(v.begin(),v.end());coutSorted vector: ;copy(v.begin(),v.end(),ostream_iteratorint(cout, ));coutendl;// 3. 反向迭代器coutReverse order: ;for(autoritv.rbegin();rit!v.rend();rit){cout*rit ;}coutendl;// 4. 插入迭代器listintl;copy(v.begin(),v.end(),front_inserter(l));coutList after front insertion: ;copy(l.begin(),l.end(),ostream_iteratorint(cout, ));coutendl;// 5. 流迭代器coutEnter some numbers (CtrlD to end): ;istream_iteratorintinput_it(cin),eof;vectorintinput_vec(input_it,eof);coutYou entered: ;copy(input_vec.begin(),input_vec.end(),ostream_iteratorint(cout, ));coutendl;return0;}8. 迭代器失效问题8.1vector插入操作可能使所有迭代器失效删除操作会使被删除元素之后的迭代器失效8.2list/set/map插入不会使任何迭代器失效删除只会使指向被删除元素的迭代器失效9. 自定义迭代器classRange{intstart,end;public:Range(ints,inte):start(s),end(e){}classiterator{intcurrent;public:iterator(intc):current(c){}intoperator*()const{returncurrent;}iteratoroperator(){current;return*this;}booloperator!(constiteratorother)const{returncurrent!other.current;}};iteratorbegin()const{returniterator(start);}iteratorend()const{returniterator(end);}};intmain(){for(inti:Range(1,5)){couti ;// 输出: 1 2 3 4}return0;}10. 性能建议尽量使用前置递增(it)而非后置递增(it)对随机访问迭代器直接使用下标可能更快避免在循环中反复调用end()可缓存其值注意迭代器失效问题特别是在修改容器时