C++ 反向迭代器注意事项
2017-01-13 20:54
393 查看
#include<iostream> #include<vector> #include<list> #include<algorithm> using namespace std; void Show(int nValue) { cout << nValue << " "; } int main() { list<int> lis;//只要不初始化,就需要在下面push_back添加; //Add list lis.push_back(1); lis.push_back(2); lis.push_back(3); lis.push_back(4); lis.push_back(5); lis.push_back(3); //返回的是一个迭代器 (指针) cout << *(lis.begin())<< " "; cout << *(--lis.end())<< " "; //返回的是一个首尾内容(具体值) cout <<lis.front()<< " "; cout <<lis.back()<< " "; cout<< "初始遍历链表: " ; ::for_each(lis.begin(),lis.end(),&Show); cout << endl; //------------------------------------------------------// //反向迭代器 reverse_iterator //cout<< "反向遍历链表: " ; //list<int>::reverse_iterator ite=lis.rbegin(); //::for_each(lis.rbegin(),lis.rend(),&Show); //cout << endl; //------------------------------------------------------// //------------------------------------------------------// //手动反向遍历 //list<int>::iterator ite=--(lis.end()); ////lis.end()指向的是链表最后一个节点的下一个节点(这个节点是空) ////当ite=lis.begin()时循环停止,会少打印一个开始(链表的头); //while(ite!=(lis.begin())) //{ // cout<< *ite<< " "; // --ite; //} //cout<< *ite<< " ";//此时,指针指向的是头,打印就会补上少打的; //------------------------------------------------------// //------------------------------------------------------// //利用反向迭代器也可以输出; //list<int>::reverse_iterator ite=lis.rbegin(); //因为rbegin指向的是链表的尾,rend指向的是链表的头的前一个,当rbegin!=rend时:\ 也就是不等于头的前一个时就停止,证号打印完头,到头的前一个不打印了; //while(ite!=lis.rend()) //{ // cout<< * ite<< " "; // ++ ite; //} //------------------------------------------------------// //------------------------------------------------------// //list<int>::reverse_iterator ite=lis.rbegin(); //while(ite!=lis.rend()) //{ // if(*ite==4) // { // list<int>::iterator itee=ite.base();//转换为正向的迭代器再去擦除其中节点;\ // ite.base()返回值就是一个正向的迭代器,所以需要接一下;\ // 转换之后,一个方向的尾就是另一个方向的头,但是头和尾都是偏差了1个节点;\ // 所以擦除的是4后面的元素,也就是5 // lis.erase(itee);//擦除ite(链表)中为3的节点;但是只能擦除正向的迭代器;所以需要转换 // break; // } // ++ite; //} //::for_each(lis.begin(),lis.end(),&Show); //cout << endl; //------------------------------------------------------// //更改版,正确擦除 //list<int>::reverse_iterator ite=lis.rbegin(); //while(ite!=lis.rend()) //{ // if(*ite==3) // { // //list<int>::iterator itee=((++ite).base());//这一种是先向后移(因为是反向的所以是向前移)一个节点在转正向的\ // //但是这个方法改变了原先的迭代器,并不推荐; // list<int>::iterator itee=--(ite.base());//转换为正向的迭代器再去擦除其中节点;\ // ite.base()返回值就是一个正向的迭代器,所以需要接一下;\ // 转换之后,一个方向的尾就是另一个方向的头,但是头和尾都是偏差了1个节点;\ // 所以擦除的是4后面的元素,也就是5 // lis.erase(itee);//擦除ite(链表)中为3的节点;但是只能擦除正向的迭代器;所以需要转换 // break; // } // ++ite; //} //::for_each(lis.begin(),lis.end(),&Show); //cout << endl; //------------------------------------------------------// //list<int>::iterator ite=lis.begin(); //while(ite!=lis.end()) //{ // if(*ite==3) // { // ite=lis.erase(ite);//当擦除3时,返回的迭代器指向的已经是擦除那个元素的下一个了;\ // 所以并不需要在++了,在++就会跳过去一个元素; // } // else // { // ++ite; // } //} //::for_each(lis.begin(),lis.end(),&Show); //cout << endl; //所以添加删除之后,需要给迭代器重新赋值; //------------------------------------------------------// system("pause"); return 0; }
相关文章推荐
- C++注意事项-----------删除,添加等操作可能会使当前迭代器失效
- C++ STL之迭代器注意事项
- C++ WideCharToMultiByte函数注意事项
- C++ 构造函数中使用new时注意事项
- C++中生成随机数的几点注意事项
- C++中typename关键字的使用方法和注意事项
- C++中typename关键字的使用方法和注意事项
- C++中的'&'和const的使用注意事项!
- c++ standard library 学习笔记-auto_ptr<T> 注意事项
- nginx 反向代理注意事项
- 关于c++的一些注意事项
- C++中typename关键字的使用方法和注意事项
- c++ shared_ptr智能指针使用注意事项
- 64位平台C/C++开发注意事项
- 使用C++ STL需要注意的事项
- C/C++常用宏定义,注意事项,宏中#和##的用法 .
- 32位和64位C++程序使用ADO访问ORACLE注意事项和区别
- 【C++注意事项】3 引用
- 关于C/C++中 常量应用的注意事项
- 迭代器的使用和注意事项