STL迭代器简介之二

来源:互联网 发布:手机发布淘宝宝贝 编辑:程序博客网 时间:2024/04/30 01:03

标准模板库(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

 

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

[c-sharp] view plaincopyprint?
  1. #include <iostream>  
  2. #include <vector>   
  3.   
  4. int main()  
  5. {  
  6.     std::vector<char> charVector;  
  7.   
  8.     int x;  
  9.     for (x=0; x<10; ++x)  
  10.         charVector.push_back(65 + x);  
  11.   
  12.     int size = charVector.size();  
  13.     for (x=0; x<size; ++x)  
  14.     {  
  15.         std::vector<char>::iterator start =  
  16.             charVector.begin();  
  17.         charVector.erase(start);  
  18.         std::vector<char>::iterator iter;  
  19.         for (iter = charVector.begin();   
  20.                 iter != charVector.end(); iter++)  
  21.         {  
  22.             std::cout << *iter;  
  23.         }  
  24.         std::cout << std::endl;  
  25.     }  
  26.   
  27.     return 0;  
  28. }  

2、deque

[c-sharp] view plaincopyprint?
  1. #include <iostream>  
  2. #include <deque>   
  3.   
  4. int main()  
  5. {  
  6.     std::deque<char> charDeque;  
  7.     int x;  
  8.     for (x=0; x<10; ++x)  
  9.         charDeque.push_front(65 + x);  
  10.   
  11.     int size = charDeque.size();  
  12.     for (x=0; x<size; ++x)  
  13.     {  
  14.         std::deque<char>::iterator start =  
  15.             charDeque.begin();  
  16.         charDeque.erase(start);  
  17.         std::deque<char>::iterator iter;  
  18.         for (iter = charDeque.begin();   
  19.                 iter != charDeque.end(); iter++)  
  20.         {  
  21.             std::cout << *iter;  
  22.         }  
  23.         std::cout << std::endl;  
  24.     }  
  25.   
  26.     return 0;  
  27. }  

3、list

[c-sharp] view plaincopyprint?
  1. #include <iostream>  
  2. #include <list>   
  3.   
  4. int main()  
  5. {  
  6.     // Create and populate the list.   
  7.     int x;  
  8.     std::list<char> charList;  
  9.     for (x=0; x<10; ++x)  
  10.         charList.push_front(65 + x);  
  11.   
  12.     // Display contents of list.   
  13.     std::cout << "Original list: ";  
  14.     std::list<char>::iterator iter;  
  15.     for (iter = charList.begin();   
  16.             iter != charList.end(); iter++)  
  17.     {  
  18.         std::cout << *iter;  
  19.         //char ch = *iter;   
  20.         //std::cout << ch;   
  21.     }  
  22.     std::cout << std::endl;  
  23.       
  24.     // Insert five Xs into the list.   
  25.     std::list<char>::iterator start = charList.begin();  
  26.     charList.insert(++start, 5, 'X');  
  27.   
  28.     // Display the result.   
  29.     std::cout << "Resultant list: ";  
  30.     for (iter = charList.begin();   
  31.     iter != charList.end(); iter++)  
  32.     {  
  33.         std::cout << *iter;  
  34.         //char ch = *iter;   
  35.         //std::cout << ch;   
  36.     }  
  37.       
  38.     return 0;  
  39. }  

4、set

[c-sharp] view plaincopyprint?
  1. #include <iostream>  
  2. #include <set>   
  3.   
  4. int main()  
  5. {  
  6.     // Create the set object.   
  7.     std::set<char> charSet;  
  8.   
  9.     // Populate the set with values.   
  10.     charSet.insert('E');  
  11.     charSet.insert('D');  
  12.     charSet.insert('C');  
  13.     charSet.insert('B');  
  14.     charSet.insert('A');  
  15.   
  16.     // Display the contents of the set.   
  17.     std::cout << "Contents of set: " << std::endl;  
  18.     std::set<char>::iterator iter;  
  19.     for (iter = charSet.begin(); iter != charSet.end(); iter++)  
  20.         std::cout << *iter << std::endl;  
  21.     std::cout << std::endl;  
  22.   
  23.     // Find the D.   
  24.     iter = charSet.find('D');  
  25.     if (iter == charSet.end())  
  26.         std::cout << "Element not found.";  
  27.     else  
  28.         std::cout << "Element found: " << *iter;  
  29.   
  30.     return 0;  
  31. }  

5、multiset

[c-sharp] view plaincopyprint?
  1. #include <iostream>  
  2. #include <set>   
  3.   
  4. int main()  
  5. {  
  6.     // Create the first set object.   
  7.     std::multiset<char> charMultiset1;  
  8.   
  9.     // Populate the multiset with values.   
  10.     charMultiset1.insert('E');  
  11.     charMultiset1.insert('D');  
  12.     charMultiset1.insert('C');  
  13.     charMultiset1.insert('B');  
  14.     charMultiset1.insert('A');  
  15.     charMultiset1.insert('B');  
  16.     charMultiset1.insert('D');  
  17.   
  18.     // Display the contents of the first multiset.   
  19.     std::cout << "Contents of first multiset: " << std::endl;  
  20.     std::multiset<char>::iterator iter;  
  21.     for (iter = charMultiset1.begin();  
  22.             iter != charMultiset1.end(); iter++)  
  23.         std::cout << *iter << std::endl;  
  24.     std::cout << std::endl;  
  25.   
  26.     // Create the second multiset object.   
  27.     std::multiset<char> charMultiset2;  
  28.   
  29.     // Populate the multiset with values.   
  30.     charMultiset2.insert('J');  
  31.     charMultiset2.insert('I');  
  32.     charMultiset2.insert('H');  
  33.     charMultiset2.insert('G');  
  34.     charMultiset2.insert('F');  
  35.     charMultiset2.insert('G');  
  36.     charMultiset2.insert('I');  
  37.       
  38.     // Display the contents of the second multiset.   
  39.     std::cout << "Contents of second multiset: "  
  40.         << std::endl;  
  41.     for (iter = charMultiset2.begin();  
  42.     iter != charMultiset2.end(); iter++)  
  43.         std::cout << *iter << std::endl;  
  44.     std::cout << std::endl;  
  45.       
  46.     // Compare the sets.   
  47.     if (charMultiset1 == charMultiset2)  
  48.         std::cout << "set1 == set2";  
  49.     else if (charMultiset1 < charMultiset2)  
  50.         std::cout << "set1 < set2";  
  51.     else if (charMultiset1 > charMultiset2)  
  52.         std::cout << "set1 > set2";  
  53.       
  54.     return 0;  
  55. }  

6、map

[c-sharp] view plaincopyprint?
  1. #include <iostream>  
  2. #include <map>   
  3.   
  4. typedef std::map<int, char> MYMAP;  
  5.   
  6. int main()  
  7. {  
  8.     // Create the first map object.   
  9.     MYMAP charMap1;  
  10.   
  11.     // Populate the first map with values.   
  12.     charMap1[1] = 'A';  
  13.     charMap1[4] = 'D';  
  14.     charMap1[2] = 'B';  
  15.     charMap1[5] = 'E';  
  16.     charMap1[3] = 'C';  
  17.   
  18.     // Display the contents of the first map.   
  19.     std::cout << "Contents of first map: " << std::endl;  
  20.     MYMAP::iterator iter;  
  21.     for (iter = charMap1.begin();  
  22.             iter != charMap1.end(); iter++)  
  23.     {  
  24.         std::cout << (*iter).first << " --> ";  
  25.         std::cout << (*iter).second << std::endl;  
  26.     }  
  27.     std::cout << std::endl;  
  28.   
  29.     // Create the second map object.   
  30.     MYMAP charMap2;  
  31.   
  32.     // Populate the first map with values.   
  33.     charMap2[1] = 'F';  
  34.     charMap2[4] = 'I';  
  35.     charMap2[2] = 'G';  
  36.     charMap2[5] = 'J';  
  37.     charMap2[3] = 'H';  
  38.   
  39.     // Display the contents of the second map.   
  40.     std::cout << "Contents of second map: " << std::endl;  
  41.     for (iter = charMap2.begin();  
  42.             iter != charMap2.end(); iter++)  
  43.     {  
  44.         std::cout << (*iter).first << " --> ";  
  45.         std::cout << (*iter).second << std::endl;  
  46.     }  
  47.     std::cout << std::endl;  
  48.   
  49.     // Compare the maps.   
  50.     if (charMap1 == charMap2)  
  51.         std::cout << "map1 == map2";  
  52.     else if (charMap1 < charMap2)  
  53.         std::cout << "map1 < map2";  
  54.     else if (charMap1 > charMap2)  
  55.         std::cout << "map1 > map2";  
  56.       
  57.     return 0;  
  58. }  

7、multimap

[c-sharp] view plaincopyprint?
  1. #include <iostream>  
  2. #include <map>   
  3.   
  4. typedef std::multimap<int, char> MYMAP;  
  5.   
  6. int main()  
  7. {  
  8.     // Create the first multimap object.   
  9.     MYMAP charMultimap;  
  10.   
  11.     // Populate the multimap with values.   
  12.     charMultimap.insert(MYMAP::value_type(1,'A'));  
  13.     charMultimap.insert(MYMAP::value_type(4,'C'));  
  14.     charMultimap.insert(MYMAP::value_type(2,'B'));  
  15.     charMultimap.insert(MYMAP::value_type(7,'E'));  
  16.     charMultimap.insert(MYMAP::value_type(5,'D'));  
  17.     charMultimap.insert(MYMAP::value_type(3,'B'));  
  18.     charMultimap.insert(MYMAP::value_type(6,'D'));  
  19.   
  20.     // Display the contents of the first multimap.   
  21.     std::cout << "Contents of first multimap: " << std::endl;  
  22.     MYMAP::iterator iter;  
  23.     for (iter = charMultimap.begin();  
  24.             iter != charMultimap.end(); iter++)  
  25.     {  
  26.         std::cout << (*iter).first << " --> ";  
  27.         std::cout << (*iter).second << std::endl;  
  28.     }  
  29.     std::cout << std::endl;  
  30.   
  31.     // Create the second multimap object.   
  32.     MYMAP charMultimap2;  
  33.   
  34.     // Populate the second multimap with values.   
  35.     charMultimap2.insert(MYMAP::value_type(1,'C'));  
  36.     charMultimap2.insert(MYMAP::value_type(4,'F'));  
  37.     charMultimap2.insert(MYMAP::value_type(2,'D'));  
  38.     charMultimap2.insert(MYMAP::value_type(7,'E'));  
  39.     charMultimap2.insert(MYMAP::value_type(5,'F'));  
  40.     charMultimap2.insert(MYMAP::value_type(3,'E'));  
  41.     charMultimap2.insert(MYMAP::value_type(6,'G'));  
  42.   
  43.     // Display the contents of the second multimap.   
  44.     std::cout << "Contents of second multimap: " << std::endl;  
  45.     for (iter = charMultimap2.begin();  
  46.             iter != charMultimap2.end(); iter++)  
  47.     {  
  48.         std::cout << (*iter).first << " --> ";  
  49.         std::cout << (*iter).second << std::endl;  
  50.     }  
  51.     std::cout << std::endl;  
  52.   
  53.     // Compare the multimaps.   
  54.     if (charMultimap == charMultimap2)  
  55.         std::cout << "multimap1 == multimap2";  
  56.     else if (charMultimap < charMultimap2)  
  57.         std::cout << "multimap1 < multimap2";  
  58.     else if (charMultimap > charMultimap2)  
  59.         std::cout << "multimap1 > multimap2";  
  60.       
  61.     return 0;  
  62. }  

8、stack

[c-sharp] view plaincopyprint?
  1. #include <iostream>  
  2. #include <list>  
  3. #include <stack>   
  4.   
  5. int main()  
  6. {  
  7.     std::stack<int, std::list<int> > intStack;  
  8.   
  9.     int x;  
  10.     std::cout << "Values pushed onto stack:"  
  11.               << std::endl;  
  12.     for (x=1; x<11; ++x)  
  13.     {  
  14.         intStack.push(x*100);  
  15.         std::cout << x*100 << std::endl;  
  16.     }  
  17.   
  18.     std::cout << "Values popped from stack:"  
  19.               << std::endl;  
  20.     int size = intStack.size();  
  21.     for (x=0; x<size; ++x)  
  22.     {  
  23.         std::cout << intStack.top() << std::endl;  
  24.         intStack.pop();  
  25.     }  
  26.   
  27.     return 0;  
  28. }  
  29. 9、queue   
  30.  
  31. #include <iostream>  
  32. #include <list>  
  33. #include <queue>   
  34.   
  35. int main()  
  36. {  
  37.     std::queue<int, std::list<int> > intQueue;  
  38.   
  39.     int x;  
  40.     std::cout << "Values pushed onto queue:"  
  41.               << std::endl;  
  42.     for (x=1; x<11; ++x)  
  43.     {  
  44.         intQueue.push(x*100);  
  45.         std::cout << x*100 << std::endl;  
  46.     }  
  47.   
  48.     std::cout << "Values removed from queue:"  
  49.               << std::endl;  
  50.     int size = intQueue.size();  
  51.     for (x=0; x<size; ++x)  
  52.     {  
  53.         std::cout << intQueue.front() << std::endl;  
  54.         intQueue.pop();  
  55.     }  
  56.   
  57.     return 0;  
  58. }  

9、queue

[c-sharp] view plaincopyprint?
  1. #include <iostream>  
  2. #include <list>  
  3. #include <queue>   
  4.   
  5. int main()  
  6. {  
  7.     std::queue<int, std::list<int> > intQueue;  
  8.   
  9.     int x;  
  10.     std::cout << "Values pushed onto queue:"  
  11.               << std::endl;  
  12.     for (x=1; x<11; ++x)  
  13.     {  
  14.         intQueue.push(x*100);  
  15.         std::cout << x*100 << std::endl;  
  16.     }  
  17.   
  18.     std::cout << "Values removed from queue:"  
  19.               << std::endl;  
  20.     int size = intQueue.size();  
  21.     for (x=0; x<size; ++x)  
  22.     {  
  23.         std::cout << intQueue.front() << std::endl;  
  24.         intQueue.pop();  
  25.     }  
  26.   
  27.     return 0;  
  28. }  

10、priority_queue

[c-sharp] view plaincopyprint?
  1. #include <iostream>  
  2. #include <list>  
  3. #include <queue>   
  4.   
  5. int main()  
  6. {  
  7.     std::priority_queue<int, std::vector<int>,std::greater<int> > intPQueue;  
  8.     int x;  
  9.     intPQueue.push(400);  
  10.     intPQueue.push(100);  
  11.     intPQueue.push(500);  
  12.     intPQueue.push(300);  
  13.     intPQueue.push(200);  
  14.   
  15.     std::cout << "Values removed from priority queue:"  
  16.               << std::endl;  
  17.     int size = intPQueue.size();  
  18.     for (x=0; x<size; ++x)  
  19.     {  
  20.         std::cout << intPQueue.top() << std::endl;  
  21.         intPQueue.pop();  
  22.     }  
  23.   
  24.     return 0;  
  25. }  

mapsetlist 类型提供双向迭代器,而 stringvectordeque 容器上定义的迭代器都是随机访问迭代器都是随机访问迭代器,用作访问内置数组元素的指针也是随机访问迭代器。istream_iterator 是输入迭代器,而ostream_iterator 则是输出迭代器。

原创粉丝点击