STL迭代器简介 标准模板库(The Standard Template Library, STL)定义了五种迭代器。下面的图表画出了这几种:

input         output

\            /

       forward

          |

       bidirectional

          |

         random access

要注意,上面这图表并不是表明它们之间的继承关系:而只是描述了迭代器的种类和接口。处于图表下层的迭代器都是相对于处于图表上层迭代器的扩张集。例如:forward迭代器不但拥有input和output迭代器的所有功能,还拥有更多的功能。

各个迭代器的功能如下:

迭代器类别

说明

输入

从容器中读取元素。输入迭代器只能一次读入一个元素向前移动,输入迭代器只支持一遍算法,同一个输入迭代器不能两遍遍历一个序列

输出

向容器中写入元素。输出迭代器只能一次一个元素向前移动。输出迭代器只支持一遍算法,统一输出迭代器不能两次遍历一个序列

正向

组合输入迭代器和输出迭代器的功能,并保留在容器中的位置

双向

组合正向迭代器和逆向迭代器的功能,支持多遍算法

随机访问

组合双向迭代器的功能与直接访问容器中任何元素的功能,即可向前向后跳过任意个元素

迭代器的操作:

每种迭代器均可进行包括表中前一种迭代器可进行的操作。

迭代器操作

说明

所有迭代器

p++

后置自增迭代器

++p

前置自增迭代器

输入迭代器

*p

复引用迭代器,作为右值

p=p1

将一个迭代器赋给另一个迭代器

p==p1

比较迭代器的相等性

p!=p1

比较迭代器的不等性

输出迭代器

*p

复引用迭代器,作为左值

p=p1

将一个迭代器赋给另一个迭代器

正向迭代器

提供输入输出迭代器的所有功能

双向迭代器

--p

前置自减迭代器

p--

后置自减迭代器

随机迭代器

p+=i

将迭代器递增i位

p-=i

将迭代器递减i位

p+i

在p位加i位后的迭代器

p-i

在p位减i位后的迭代器

p[i]

返回p位元素偏离i位的元素引用

p<p1

如果迭代器p的位置在p1前,返回true,否则返回false

p<=p1

p的位置在p1的前面或同一位置时返回true,否则返回false

p>p1

如果迭代器p的位置在p1后,返回true,否则返回false

p>=p1

p的位置在p1的后面或同一位置时返回true,否则返回false

只有顺序容器和关联容器支持迭代器遍历,各容器支持的迭代器的类别如下:

容器

支持的迭代器类别

说明

vector

随机访问

一种随机访问的数组类型,提供了对数组元素进行快速随机访问以及在序列尾部进行快速的插入和删除操作的功能。可以再需要的时候修改其自身的大小

deque

随机访问

一种随机访问的数组类型,提供了序列两端快速进行插入和删除操作的功能。可以再需要的时候修改其自身的大小

list

双向

一种不支持随机访问的数组类型,插入和删除所花费的时间是固定的,与位置无关。

set

双向

一种随机存取的容器,其关键字和数据元素是同一个值。所有元素都必须具有惟一值。

multiset

双向

一种随机存取的容器,其关键字和数据元素是同一个值。可以包含重复的元素。

map

双向

一种包含成对数值的容器,一个值是实际数据值,另一个是用来寻找数据的关键字。一个特定的关键字只能与一个元素关联。

multimap

双向

一种包含成对数值的容器,一个值是实际数据值,另一个是用来寻找数据的关键字。一个关键字可以与多个数据元素关联。

stack

不支持

适配器容器类型,用vector,deque或list对象创建了一个先进后出容器

queue

不支持

适配器容器类型,用deque或list对象创建了一个先进先出容器

priority_queue

不支持

适配器容器类型,用vector或deque对象创建了一个排序队列

下面列举了些例子说明各个容器的用法: 1、vector

#include <iostream> #include <vector>
int main() {     std::vector<char> charVector;
    int x;     for (x=0; x<10; ++x)         charVector.push_back(65 + x);
    int size = charVector.size();     for (x=0; x<size; ++x)     {         std::vector<char>::iterator start =             charVector.begin();         charVector.erase(start);         std::vector<char>::iterator iter;         for (iter = charVector.begin();                  iter != charVector.end(); iter++)         {             std::cout << *iter;         }         std::cout << std::endl;     }
    return 0; }

2、deque

#include <iostream> #include <deque>
int main() {     std::deque<char> charDeque;     int x;     for (x=0; x<10; ++x)         charDeque.push_front(65 + x);
    int size = charDeque.size();     for (x=0; x<size; ++x)     {         std::deque<char>::iterator start =             charDeque.begin();         charDeque.erase(start);         std::deque<char>::iterator iter;         for (iter = charDeque.begin();                  iter != charDeque.end(); iter++)         {             std::cout << *iter;         }         std::cout << std::endl;     }
    return 0; }

3、list

#include <iostream> #include <list>
int main() {     // Create and populate the list.     int x;     std::list<char> charList;     for (x=0; x<10; ++x)         charList.push_front(65 + x);
    // Display contents of list.     std::cout << "Original list: ";     std::list<char>::iterator iter;     for (iter = charList.begin();              iter != charList.end(); iter++)     {         std::cout << *iter;         //char ch = *iter;         //std::cout << ch;     }     std::cout << std::endl;          // Insert five Xs into the list.     std::list<char>::iterator start = charList.begin();     charList.insert(++start, 5, 'X');
    // Display the result.     std::cout << "Resultant list: ";     for (iter = charList.begin();      iter != charList.end(); iter++)     {         std::cout << *iter;         //char ch = *iter;         //std::cout << ch;     }          return 0; }

4、set

#include <iostream> #include <set>
int main() {     // Create the set object.     std::set<char> charSet;
    // Populate the set with values.     charSet.insert('E');     charSet.insert('D');     charSet.insert('C');     charSet.insert('B');     charSet.insert('A');
    // Display the contents of the set.     std::cout << "Contents of set: " << std::endl;     std::set<char>::iterator iter;     for (iter = charSet.begin(); iter != charSet.end(); iter++)         std::cout << *iter << std::endl;     std::cout << std::endl;
    // Find the D.     iter = charSet.find('D');     if (iter == charSet.end())         std::cout << "Element not found.";     else         std::cout << "Element found: " << *iter;
    return 0; }

5、multiset

#include <iostream> #include <set>
int main() {     // Create the first set object.     std::multiset<char> charMultiset1;
    // Populate the multiset with values.     charMultiset1.insert('E');     charMultiset1.insert('D');     charMultiset1.insert('C');     charMultiset1.insert('B');     charMultiset1.insert('A');     charMultiset1.insert('B');     charMultiset1.insert('D');
    // Display the contents of the first multiset.     std::cout << "Contents of first multiset: " << std::endl;     std::multiset<char>::iterator iter;     for (iter = charMultiset1.begin();             iter != charMultiset1.end(); iter++)         std::cout << *iter << std::endl;     std::cout << std::endl;
    // Create the second multiset object.     std::multiset<char> charMultiset2;
    // Populate the multiset with values.     charMultiset2.insert('J');     charMultiset2.insert('I');     charMultiset2.insert('H');     charMultiset2.insert('G');     charMultiset2.insert('F');     charMultiset2.insert('G');     charMultiset2.insert('I');          // Display the contents of the second multiset.     std::cout << "Contents of second multiset: "         << std::endl;     for (iter = charMultiset2.begin();     iter != charMultiset2.end(); iter++)         std::cout << *iter << std::endl;     std::cout << std::endl;          // Compare the sets.     if (charMultiset1 == charMultiset2)         std::cout << "set1 == set2";     else if (charMultiset1 < charMultiset2)         std::cout << "set1 < set2";     else if (charMultiset1 > charMultiset2)         std::cout << "set1 > set2";          return 0; }

6、map

#include <iostream> #include <map>
typedef std::map<int, char> MYMAP;
int main() {     // Create the first map object.     MYMAP charMap1;
    // Populate the first map with values.     charMap1[1] = 'A';     charMap1[4] = 'D';     charMap1[2] = 'B';     charMap1[5] = 'E';     charMap1[3] = 'C';
    // Display the contents of the first map.     std::cout << "Contents of first map: " << std::endl;     MYMAP::iterator iter;     for (iter = charMap1.begin();             iter != charMap1.end(); iter++)     {         std::cout << (*iter).first << " --> ";         std::cout << (*iter).second << std::endl;     }     std::cout << std::endl;
    // Create the second map object.     MYMAP charMap2;
    // Populate the first map with values.     charMap2[1] = 'F';     charMap2[4] = 'I';     charMap2[2] = 'G';     charMap2[5] = 'J';     charMap2[3] = 'H';
    // Display the contents of the second map.     std::cout << "Contents of second map: " << std::endl;     for (iter = charMap2.begin();             iter != charMap2.end(); iter++)     {         std::cout << (*iter).first << " --> ";         std::cout << (*iter).second << std::endl;     }     std::cout << std::endl;
    // Compare the maps.     if (charMap1 == charMap2)         std::cout << "map1 == map2";     else if (charMap1 < charMap2)         std::cout << "map1 < map2";     else if (charMap1 > charMap2)         std::cout << "map1 > map2";          return 0; }

7、multimap

#include <iostream> #include <map>
typedef std::multimap<int, char> MYMAP;
int main() {     // Create the first multimap object.     MYMAP charMultimap;
    // Populate the multimap with values.     charMultimap.insert(MYMAP::value_type(1,'A'));     charMultimap.insert(MYMAP::value_type(4,'C'));     charMultimap.insert(MYMAP::value_type(2,'B'));     charMultimap.insert(MYMAP::value_type(7,'E'));     charMultimap.insert(MYMAP::value_type(5,'D'));     charMultimap.insert(MYMAP::value_type(3,'B'));     charMultimap.insert(MYMAP::value_type(6,'D'));
    // Display the contents of the first multimap.     std::cout << "Contents of first multimap: " << std::endl;     MYMAP::iterator iter;     for (iter = charMultimap.begin();             iter != charMultimap.end(); iter++)     {         std::cout << (*iter).first << " --> ";         std::cout << (*iter).second << std::endl;     }     std::cout << std::endl;
    // Create the second multimap object.     MYMAP charMultimap2;
    // Populate the second multimap with values.     charMultimap2.insert(MYMAP::value_type(1,'C'));     charMultimap2.insert(MYMAP::value_type(4,'F'));     charMultimap2.insert(MYMAP::value_type(2,'D'));     charMultimap2.insert(MYMAP::value_type(7,'E'));     charMultimap2.insert(MYMAP::value_type(5,'F'));     charMultimap2.insert(MYMAP::value_type(3,'E'));     charMultimap2.insert(MYMAP::value_type(6,'G'));
    // Display the contents of the second multimap.     std::cout << "Contents of second multimap: " << std::endl;     for (iter = charMultimap2.begin();             iter != charMultimap2.end(); iter++)     {         std::cout << (*iter).first << " --> ";         std::cout << (*iter).second << std::endl;     }     std::cout << std::endl;
    // Compare the multimaps.     if (charMultimap == charMultimap2)         std::cout << "multimap1 == multimap2";     else if (charMultimap < charMultimap2)         std::cout << "multimap1 < multimap2";     else if (charMultimap > charMultimap2)         std::cout << "multimap1 > multimap2";          return 0; }

8、stack

#include <iostream> #include <list> #include <stack>
int main() {     std::stack<int, std::list<int> > intStack;
    int x;     std::cout << "Values pushed onto stack:"               << std::endl;     for (x=1; x<11; ++x)     {         intStack.push(x*100);         std::cout << x*100 << std::endl;     }
    std::cout << "Values popped from stack:"               << std::endl;     int size = intStack.size();     for (x=0; x<size; ++x)     {         std::cout << intStack.top() << std::endl;         intStack.pop();     }
    return 0; }

9、queue

#include <iostream> #include <list> #include <queue>
int main() {     std::queue<int, std::list<int> > intQueue;
    int x;     std::cout << "Values pushed onto queue:"               << std::endl;     for (x=1; x<11; ++x)     {         intQueue.push(x*100);         std::cout << x*100 << std::endl;     }
    std::cout << "Values removed from queue:"               << std::endl;     int size = intQueue.size();     for (x=0; x<size; ++x)     {         std::cout << intQueue.front() << std::endl;         intQueue.pop();     }
    return 0; }

10、priority_queue

#include <iostream> #include <list> #include <queue>
int main() {     std::priority_queue<int, std::vector<int>,std::greater<int> > intPQueue;     int x;     intPQueue.push(400);     intPQueue.push(100);     intPQueue.push(500);     intPQueue.push(300);     intPQueue.push(200);
    std::cout << "Values removed from priority queue:"               << std::endl;     int size = intPQueue.size();     for (x=0; x<size; ++x)     {         std::cout << intPQueue.top() << std::endl;         intPQueue.pop();     }
    return 0; }

STL迭代器笔记的更多相关文章

  1. C++ STL初学笔记

    C++  STL初学笔记 更系统的版本见徐本柱的PPT set 在这儿:http://www.cnblogs.com/pdev/p/4035020.html #include <vector&g ...

  2. Effective STL 读书笔记

    Effective STL 读书笔记 标签(空格分隔): 未分类 慎重选择容器类型 标准STL序列容器: vector.string.deque和list(双向列表). 标准STL管理容器: set. ...

  3. Effective STL读书笔记

    Effective STL 读书笔记 本篇文字用于总结在阅读<Effective STL>时的笔记心得,只记录书上描写的,但自己尚未熟练掌握的知识点,不记录通用.常识类的知识点. STL按 ...

  4. Effective STL 学习笔记 32 ~ 33

    Effective STL 学习笔记 32 ~ 33 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  5. Effective STL 学习笔记 31:排序算法

    Effective STL 学习笔记 31:排序算法 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  6. Effective STL 学习笔记 Item 26: Prefer Iterator to reverse_iterator and const_rever_itertor

    Effective STL 学习笔记 Item 26: Prefer Iterator to reverse_iterator and const_rever_itertor */--> div ...

  7. 一步一步的理解C++STL迭代器

    一步一步的理解C++STL迭代器 "指针"对全部C/C++的程序猿来说,一点都不陌生. 在接触到C语言中的malloc函数和C++中的new函数后.我们也知道这两个函数返回的都是一 ...

  8. STL 迭代器 iterator const

    STL迭代器很多时候可以当成指针来使用. 但是指针一般可以用const来控制访问. 那迭代器呢. #include <iostream> #include <vector> u ...

  9. Effective STL 学习笔记 39 ~ 41

    Effective STL 学习笔记 39 ~ 41 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

随机推荐

  1. 13.C#分部类型和静态类(七章7.1-7.2)

    再大的东西不去找,也就没了,再小的知识不去记,也就忘了.今天来写一写C#中的分部类型和静态工具类,这些两个概念可能在我们的日常使用过程中都使用过,可能大家对这些内容觉得这些不是应该有的东西嘛,那就来复 ...

  2. WEB前端开发规范

    WEB前端开发规范 规范目的 为提高团队协作效率, 便于后台人员添加功能及前端后期优化维护, 输出高质量的文档, 特制订此文档.本文档如有不对或者不合适的地方请及时提出, 经讨论决定后方可更改. 基本 ...

  3. 【Moqui业务逻辑翻译系列】Sales Representative Seeks Prospects and Opportunities 销售代表寻找期望合作对象和机会

    h1. Sales Representative Seeks Prospects and Opportunities 销售代表寻找期望合作对象和合作机会 h4. Ideas to incorporat ...

  4. Nginx下Redmine配置

    安装redmine依赖的所有ruby包 cd .. gem install bundler #注意是在网站根目录下执行 bundle install --without development tes ...

  5. Mvc多级Views目录 asp.net mvc4 路由重写及 修改view 的寻找视图的规则

    一般我们在mvc开发过程中,都会碰到这样的问题.页面总是写在Views文件夹下,而且还只能一个Controller的页面只能写在相应的以 Controller名命名的文件夹下.如果我们写到别处呢?那么 ...

  6. 【POJ 2484】A Funny Game

    Description Alice and Bob decide to play a funny game. At the beginning of the game they pick n(1 &l ...

  7. codevs1358 棋盘游戏

    题目描述 Description 这个游戏在一个有10*10个格子的棋盘上进行,初始时棋子位于左上角,终点为右下角,棋盘上每个格子内有一个0到9的数字,每次棋子可以往右方或下方的相邻格子移动,求一条经 ...

  8. RedGate .NET Reflector注册问题(反注册)

    Reflector分为桌面版和VS集成版本,当我们使用注册机注册的时候如果注册了Standvard版本,那么我们的VS就不能集成查看,也不能Debug,那么这 显然不是我们想要的,我们会选择重新注册, ...

  9. PHP局部变量与全局变量

    一.局部变量定义:在函数内部声明,且只能在函数内部调用的变量. 注意:参数也是局部变量的一种. demo1:1 function demo1(){2     $age = 10;3 }4 5 echo ...

  10. laravel框架中的session问题

    这两天一直在鼓捣服务器,配置环境,在搭建laravel的过程之中,发现了laravel中的session的一些问题,这里总结一下: (1):我在服务器上搭建了多个sever,为了测试学习,分别使用不同 ...