C++迭代器(STL迭代器)iterator学习

参考自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];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值