参考自http://c.biancheng.net/view/338.html
要访问顺序容器和关联容器中的元素,需要通过“迭代器(iterator)”进行。迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。迭代器可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。从这一点上看,迭代器和指针类似。
正向迭代器
容器类名::iterator 迭代器名;
常量正向迭代器
容器类名::const_iterator 迭代器名;
反向迭代器
容器类名::reverse_itertor 迭代器名;
常量反向迭代器
容器类名::const_reverse_iterator 迭代器名;
通过迭代器读取它指向的元素,*迭代器名
表示迭代器指向的元素,通过非常量迭代器能修改其指向的元素。
迭代器都可以进行++操作。
正向迭代器++会指向容器中后一个元素
反向迭代器++会指向容器中前一个元素
迭代器简单用法示例
题目来自HDU1276
http://acm.hdu.edu.cn/showproblem.php?pid=1276
#include<bits/stdc++.h>
using namespace std;
int main(){
int t,n;
cin>>t;
while(t--){
cin>>n;
list<int>l;//定义一个链表
list<int>::iterator x;//定义迭代器
int k=2;//控制报数是2还是3
for(int i=1;i<=n;i++){
l.push_back(i);//赋值
}
while(l.size()>3){
int sum=1;
for(x=l.begin();x!=l.end();){//从第一个元素循环到最后一个元素
if(sum++%k==0)
x=l.erase(x);//删除元素
else
x++;
}
k==2?k=3:k=2;//1到2报数,1到3报数
}
for(x=l.begin();x!=l.end();x++){
if(x!=l.begin())
cout<<" ";
cout<<*x;
}
cout<<endl;
}
return 0;
}
容器 | 迭代器功能 |
---|---|
vector | 随机访问 |
deque | 随机访问 |
list | 双向 |
set/multiset | 双向 |
map/multimap | 双向 |
stack | 不支持迭代器 |
queue | 不支持迭代器 |
priority_queue | 不支持迭代器 |
遍历vector容器
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v(100); //v被初始化成有100个元素
for(int i = 0;i < v.size() ; ++i) //size返回元素个数
cout << v[i]; //像普通数组一样使用vector容器
vector<int>::iterator i;
for(i = v.begin(); i != v.end (); ++i) //用 != 比较两个迭代器
cout << * i;
for(i = v.begin(); i < v.end ();++i) //用 < 比较两个迭代器
cout << * i;
i = v.begin();
while(i < v.end()) { //间隔一个输出
cout << * i;
i += 2; // 随机访问迭代器支持 "+= 整数" 的操作
}
}
**注意:**双向迭代器不支持用<进行比较
例:
list<int> v;
list<int>::const_iterator i;
以下代码是合法的:
for(i=v.begin(); i!=v.end(); ++i)
cout << *i;
以下代码则不合法:
for(i=v.begin(); i<v.end(); ++i)
cout << *i;
因为双向迭代器不支持用“<”进行比较。以下代码也不合法:
for(int i=0; i<v.size(); ++i)
cout << v[i];