迭代器是一种“能够遍历某个序列内所有元素”的对象。
一..随机存取迭代器:
以下对象支持随机存取迭代器
可随机存取的容器(vector,deque)
strings
一般arrray(指针)
下面是一个随机存取(Random Access)迭代器的例子:
#include<iostream> #include<vector> using namespace std; void main() { vector<int> myv; for (int i = -3; i <= 9; ++i) { myv.push_back(i); } //打印元素的个数 //iter1-iter2 传回iter1和iter2之间的距离 cout << "num of ele=" << <span style="color:#ff0000;">myv.end() - myv.begin()</span> << endl; //打印出所有元素 //用operator<代替!= vector<int>::iterator it; for (it = myv.begin(); <span style="color:#ff0000;">it < myv.end()</span>; ++it) { cout << *it << " "; } cout << endl; //打印所有元素 //使用下标运算符[] for (int i = 0; i < myv.size(); ++i) { cout << myv.begin()<span style="color:#ff0000;">[i]</span> << " "; } cout << endl; //每两个打印一次、 for (it = myv.begin(); it < myv.end() - 1; it += 2) { cout << *it << " "; } cout << endl; cin.get(); }
通过随机存取迭代器遍历容器的时候,可以使用operator<代替!=。
二..迭代器的相关辅助函数
1.advance():可将迭代器的位置增加,增加的幅度由参数决定,也就是说使迭代器一次前进
或者后退多个元素。
本质:面对随机存取迭代器,此函数只是简单的调用pos+=n;因此具有常量复杂度。
对于其他任何类型的迭代器则调用++pos(或--pos),此时,本函数具有线性复杂度。
下面是使用advance()函数的一个例子
#include<iostream> #include<list> using namespace std; void main() { list<int> mylist; for (int i = 1; i <= 9; ++i) { mylist.push_back(i); } list<int>::iterator pos; for (pos = mylist.begin(); pos != mylist.end(); ++pos) { cout << *pos<<" "; } cout << endl; list<int>::iterator it=mylist.begin(); cout << *it << endl; advance(it, 3);//迭代器前进或者后退 cout << *it << endl; advance(it, -1); cout << *it << endl; cin.get(); }
2.distance():用来处理两个迭代器之间的距离。
本质:面对随机存取迭代器,此函数仅仅是传回pos2-pos1,因此具备常数复杂度。
对于其他迭代器类型,distance()会不断递增pos1,知道抵达pos2为止,然后返回
递增次数。此时本函数具备线性复杂度。
下面是使用distance()的例子:
#include<iostream> #include<list> using namespace std; void main() { list<int> mylist; for (int i = 1; i <= 9; ++i) { mylist.push_back(i); } for (auto i : mylist) { cout << i << " "; } cout << endl; list<int>::iterator pos; pos = find(mylist.begin(), mylist.end(), 5); if (pos != mylist.end()) { cout << "找到了5,distance b/t beginning and 5 is" << distance(mylist.begin(), pos) << endl; } else { cout << "没有找到" << endl; } cin.get(); }
注意:迭代器的类型不必相同,但是其所指的两个值必须可以相互赋值。
下面是使用iter_swap()的例子:
#include<iostream> #include<list> using namespace std; void main() { list<int> mylist; for (int i = 1; i <= 9; ++i) { mylist.push_back(i); } for (auto i : mylist) { cout << i << " "; } cout << endl; iter_swap(mylist.begin(), ++mylist.begin()); for (auto i : mylist) { cout << i << " "; } cout << endl; iter_swap(mylist.begin(), --mylist.end()); for (auto i : mylist) { cout << i << " "; } cout << endl; cin.get(); }