STL的迭代器--Iterator

STL中的迭代器类似指针,但不仅仅是指针。迭代器和指针很像,功能很像指针,但是实际上,迭代器是通过重载一元的”*”和”->”来从容器 中间接地返回一个值。将这些值存储在容器中并不是一个好主意,因为每当一个新值添加到容器中或者有一个值从容器中删除,这些值就会失效。在某种程度上,迭 代器可以看作是句柄(handle)。通常情况下迭代器(iterator)的类型可以有所变化,这样容器也会有几种不同方式的转变: iterator——对于除了vector以外的其他任何容器,你可以通过这种迭代器在一次操作中在容器中朝向前的方向走一步。这意味着对于这种迭代器你 只能使用“++”操作符。而不能使用“--”或“+=”操作符。而对于vector这一种容器,你可以使用“+=”、“—”、“++”、“-=”中的任何 一种操作符和“<”、“<=”、“>”、“>=”、“==”、“!=”等比较运算符。 reverse_iterator ——如果你想用向后的方向而不是向前的方向的迭代器来遍历除vector之外的容器中的元素,你可以使用reverse_iterator 来反转遍历的方向,你还可以用rbegin()来代替begin(),用rend()代替end(),而此时的“++”操作符会朝向后的方向遍历。         const_iterator ——一个向前方向的迭代器,它返回一个常数值。你可以使用这种类型的迭代器来指向一个只读的值。         const_reverse_iterator ——一个朝反方向遍历的迭代器,它返回一个常数值。

混合迭代器函数

在涉及到容器和算法的操作中,还有两个迭代器函数非常有用:

· advance() 按指定的数目来增减迭代器。 template<class InIt, class Dist>      void advance(InIt& it, Dist n);     n为正时,递增第一个参数所传递的迭代器;n为负时,递减所传递的迭代器。

· distance() 返回到达一个迭代器所需(递增)操作的数目。 template<class Init, class Dist>      Dist distance(InIt first, InIt last, Dist& n);

Distance is an overloaded name; there are actually two distance functions.

template <class InputIterator> inline iterator_traits<InputIterator>::difference_type distance(InputIterator first, InputIterator last);

template <class InputIterator, class Distance> void distance(InputIterator first, InputIterator last, Distance& n);  比较前后两个迭代器之间的数目。

例如:

  1. list iList;   
  2.   
  3. list::iterator p = find(iList.begin(), iList.end(), 2);   
  4.   
  5. cout << "before: p == "  << *p << endl;   
  6.   
  7. advance(p, 2); // same as p = p + 2;    
  8.   
  9. cout << "after : p == "  << *p << endl;   
  10.   
  11. int  k = 0;   
  12.   
  13. distance(p, iList.end(), k);   
  14.   
  15. cout << "k == "  << k << endl;  // 返回两者之间的数目   
list iList; 

list::iterator p = find(iList.begin(), iList.end(), 2); 

cout << "before: p == " << *p << endl; 

advance(p, 2); // same as p = p + 2; 

cout << "after : p == " << *p << endl; 

int k = 0; 

distance(p, iList.end(), k); 

cout << "k == " << k << endl; // 返回两者之间的数目
  1. advance()函数接受两个参数。第二个参数是向前推进的数目。对于前推迭代器,该值必须为正,而对于双向迭代器和随机访问迭代器,该值可以为负。   
advance()函数接受两个参数。第二个参数是向前推进的数目。对于前推迭代器,该值必须为正,而对于双向迭代器和随机访问迭代器,该值可以为负。 
  1. 使用 distance()函数来返回到达另一个迭代器所需要的步骤。 注意 distance()函数是迭代的,也就是说,它递增第三个参数。因此,你必须初始化该参数。未初始化该参数几乎注定要失败。   
使用 distance()函数来返回到达另一个迭代器所需要的步骤。 注意 distance()函数是迭代的,也就是说,它递增第三个参数。因此,你必须初始化该参数。未初始化该参数几乎注定要失败。 

distance () Sample Code:

  1. <pre  class = "csharp"  name= "code" > // distance.cpp   
  2.   
  3. // compile with: /EHsc   
  4.  
  5.  
  6.  
  7. #pragma warning (disable:4786)   
  8.   
  9. #include <iostream>  
  10.  
  11. #include <vector>   
  12.   
  13. #include <iterator>  
  14.  
  15. #include <string>   
  16.   
  17.   
  18.   
  19. using   namespace  std;  
  20.   
  21.   
  22.   
  23. typedef vector<string  > VTRLIST;  
  24.   
  25.   
  26.   
  27. int  main() {  
  28.   
  29.     VTRLIST Vector;  
  30.   
  31.     VTRLIST::iterator iVector;  
  32.   
  33.     VTRLIST::difference_type dTheDiff;  
  34.   
  35.   
  36.   
  37.     Vector.push_back("A1" );  
  38.   
  39.     Vector.push_back("B2" );  
  40.   
  41.     Vector.push_back("C3" );  
  42.   
  43.     Vector.push_back("D4" );  
  44.   
  45.     Vector.push_back("E5" );  
  46.   
  47.     Vector.push_back("F6" );  
  48.   
  49.     Vector.push_back("G7" );  
  50.   
  51.   
  52.   
  53.     // Print out the list   
  54.   
  55.     iVector=Vector.begin();  
  56.   
  57.     cout << "The list is: " ;  
  58.   
  59.     for  ( int  i = 0; i < 7 ; i++, iVector++)  
  60.   
  61.         cout << *iVector  << "  " ;  
  62.   
  63.   
  64.   
  65.     // Initialize the iterator the first element"   
  66.   
  67.     iVector=Vector.begin();  
  68.   
  69.     cout << "/n/nAdvance to the 3rd element."  << endl;  
  70.   
  71.     advance( iVector, 2);  
  72.   
  73.     cout << "The element is "  << *iVector << endl;  
  74.   
  75.     dTheDiff = distance( Vector.begin(), iVector);  
  76.   
  77.     cout << "The distance from the beginning is "  << dTheDiff << endl;  
  78.   
  79.   
  80.   
  81.     cout << "Calculate it in reverse order "  << endl;  
  82.   
  83.     dTheDiff = distance( iVector, Vector.begin());  
  84.   
  85.     cout << "The distance is "  << dTheDiff << endl;  
  86.   
  87.   
  88.   
  89.     cout << "/nUse distance() to count from the 3rd element to the end."   
  90.   
  91.          << endl;  
  92.   
  93.     dTheDiff = distance( iVector, Vector.end());  
  94.   
  95.   
  96.   
  97.     // Note that end() returns one past the end of the sequence   
  98.   
  99.     cout << "The distance is "  << dTheDiff << endl;  
  100.   
  101.   
  102.   
  103.     cout <<"/nUse distance() to count the total length."  << endl;  
  104.   
  105.     dTheDiff = distance( Vector.begin(), Vector.end() );  
  106.   
  107.     cout << "The total distance is "  << dTheDiff << endl;  
  108.   
  109. }  
  110. </pre>  
  111. <pre class = "csharp"  name= "code" ><div  class = "MTPS_CollapsibleSection"  id= "ctl00_rs1_mainContentContainer_cpe63954_c"  style= "display: block; overflow: visible; width: auto; height: auto;" ><div  class = "MTPS_CollapsibleSection"  id= ""  style= "border: medium none; display: block;" ><pre><pre  class = "csharp"  name= "code" > /*  
  112.  
  113. Output   
  114.  
  115. The list is: A1  B2  C3  D4  E5  F6  G7    
  116.  
  117.  
  118.  
  119. Advance to the 3rd element.  
  120.  
  121. The element is C3  
  122.  
  123. The distance from the beginning is 2  
  124.  
  125. Calculate it in reverse order   
  126.  
  127. The distance is -2  
  128.  
  129.  
  130.  
  131. Use distance() to count from the 3rd element to the end.  
  132.  
  133. The distance is 5  
  134.  
  135.  
  136.  
  137. Use distance() to count the total length.  
  138.  
  139. The total distance is 7  
  140.  
  141. */   
  142. </pre>  
  143. </pre>  
  144. </div>  
  145. </div>  
  146. </pre>  

  
  
  1. // distance.cpp   
  2.   
  3. // compile with: /EHsc   
  4.  
  5.  
  6.  
  7. #pragma warning (disable:4786)   
  8.   
  9. #include <iostream>  
  10.  
  11. #include <vector>   
  12.   
  13. #include <iterator>  
  14.  
  15. #include <string>   
  16.   
  17.   
  18.   
  19. using   namespace  std;  
  20.   
  21.   
  22.   
  23. typedef vector<string  > VTRLIST;  
  24.   
  25.   
  26.   
  27. int  main() {  
  28.   
  29.     VTRLIST Vector;  
  30.   
  31.     VTRLIST::iterator iVector;  
  32.   
  33.     VTRLIST::difference_type dTheDiff;  
  34.   
  35.   
  36.   
  37.     Vector.push_back("A1" );  
  38.   
  39.     Vector.push_back("B2" );  
  40.   
  41.     Vector.push_back("C3" );  
  42.   
  43.     Vector.push_back("D4" );  
  44.   
  45.     Vector.push_back("E5" );  
  46.   
  47.     Vector.push_back("F6" );  
  48.   
  49.     Vector.push_back("G7" );  
  50.   
  51.   
  52.   
  53.     // Print out the list   
  54.   
  55.     iVector=Vector.begin();  
  56.   
  57.     cout << "The list is: " ;  
  58.   
  59.     for  ( int  i = 0; i < 7 ; i++, iVector++)  
  60.   
  61.         cout << *iVector  << "  " ;  
  62.   
  63.   
  64.   
  65.     // Initialize the iterator the first element"   
  66.   
  67.     iVector=Vector.begin();  
  68.   
  69.     cout << "/n/nAdvance to the 3rd element."  << endl;  
  70.   
  71.     advance( iVector, 2);  
  72.   
  73.     cout << "The element is "  << *iVector << endl;  
  74.   
  75.     dTheDiff = distance( Vector.begin(), iVector);  
  76.   
  77.     cout << "The distance from the beginning is "  << dTheDiff << endl;  
  78.   
  79.   
  80.   
  81.     cout << "Calculate it in reverse order "  << endl;  
  82.   
  83.     dTheDiff = distance( iVector, Vector.begin());  
  84.   
  85.     cout << "The distance is "  << dTheDiff << endl;  
  86.   
  87.   
  88.   
  89.     cout << "/nUse distance() to count from the 3rd element to the end."   
  90.   
  91.          << endl;  
  92.   
  93.     dTheDiff = distance( iVector, Vector.end());  
  94.   
  95.   
  96.   
  97.     // Note that end() returns one past the end of the sequence   
  98.   
  99.     cout << "The distance is "  << dTheDiff << endl;  
  100.   
  101.   
  102.   
  103.     cout <<"/nUse distance() to count the total length."  << endl;  
  104.   
  105.     dTheDiff = distance( Vector.begin(), Vector.end() );  
  106.   
  107.     cout << "The total distance is "  << dTheDiff << endl;  
  108.   
  109. }  
  1. <div  class = "MTPS_CollapsibleSection"  id= "ctl00_rs1_mainContentContainer_cpe63954_c"  style= "display: block; overflow: visible; width: auto; height: auto;" ><div  class = "MTPS_CollapsibleSection"  id= ""  style= "border: medium none; display: block;" ><pre><pre  class = "csharp"  name= "code" > /*  
  2.  
  3. Output   
  4.  
  5. The list is: A1  B2  C3  D4  E5  F6  G7    
  6.  
  7.  
  8.  
  9. Advance to the 3rd element.  
  10.  
  11. The element is C3  
  12.  
  13. The distance from the beginning is 2  
  14.  
  15. Calculate it in reverse order   
  16.  
  17. The distance is -2  
  18.  
  19.  
  20.  
  21. Use distance() to count from the 3rd element to the end.  
  22.  
  23. The distance is 5  
  24.  
  25.  
  26.  
  27. Use distance() to count the total length.  
  28.  
  29. The total distance is 7  
  30.  
  31. */   
  32. </pre>  
  33. </pre>  
  34. </div>  
  35. </div>  

  
  
      
      
  1. /*  
  2.  
  3. Output   
  4.  
  5. The list is: A1  B2  C3  D4  E5  F6  G7    
  6.  
  7.  
  8.  
  9. Advance to the 3rd element.  
  10.  
  11. The element is C3  
  12.  
  13. The distance from the beginning is 2  
  14.  
  15. Calculate it in reverse order   
  16.  
  17. The distance is -2  
  18.  
  19.  
  20.  
  21. Use distance() to count from the 3rd element to the end.  
  22.  
  23. The distance is 5  
  24.  
  25.  
  26.  
  27. Use distance() to count the total length.  
  28.  
  29. The total distance is 7  
  30.  
  31. */   
 advance()  Sample Code: 
 // Advance.cpp

// compile with: /EHsc


#pragma warning (disable:4786)
#include <iostream>
#include <string>
#include <list>



using namespace std ;



typedef list<string> STRLIST;



int main() {

    STRLIST List;

    STRLIST::iterator iList;

    STRLIST::difference_type dTheDiff;



    List.push_back("A1");

    List.push_back("B2");

    List.push_back("C3");

    List.push_back("D4");

    List.push_back("E5");

    List.push_back("F6");

    List.push_back("G7");



    // Print out the list

    iList=List.begin();

    cout << "The list is: ";

    for (int i = 0; i < 7 ; i++, iList++)

        cout << *iList  << "  ";



    // Initialize to the first element"

    iList=List.begin();

    cout << "/n/nAdvance to the 3rd element." << endl;

    advance(iList,2);

    cout << "The element is " << *iList << endl;



}
  1. /*  
  2.  
  3. Output   
  4.  
  5. The list is: A1  B2  C3  D4  E5  F6  G7    
  6.  
  7.  
  8.  
  9. Advance to the 3rd element.  
  10.  
  11. The element is C3  
  12.  
  13.  
  14.  
  15. */   
/*

Output 

The list is: A1  B2  C3  D4  E5  F6  G7  



Advance to the 3rd element.

The element is C3



*/






当然advance() 和distance() 还可以用来对const_iterator转换为iterator.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值