1. 程式人生 > >C++標準模板庫 迭代器 iterator 詳解(一)

C++標準模板庫 迭代器 iterator 詳解(一)

[cpp] view plaincopyprint?
  1. #include <vector>
  2. #include <iostream>
  3. #include <list>
  4. #include <algorithm>
  5. #include <iterator> //copy
  6. usingnamespace std;  
  7. template <class T>  
  8. inlinevoid print (const T& coll, constchar* optcstr="")  
  9. {  
  10.     typename
     T::const_iterator pos;  
  11.     std::cout << optcstr;  
  12.     for (pos=coll.begin(); pos!=coll.end(); ++pos)  
  13.     {  
  14.         std::cout << *pos << ' ';  
  15.     }  
  16.     std::cout << std::endl;  
  17. }  
  18. void  test_random_access_iterator()  
  19. {  
  20.    vector<int> coll;  
  21.     // insert elements from 1991 to 2013
  22.    for (int i=1991; i<=2013; ++i)  
  23.    {  
  24.        coll.push_back (i);  
  25.    }  
  26.    /* print number of elements by processing the distance between beginning and end 
  27.     * - NOTE: uses operator - for iterators 
  28.     */
  29.    cout << "number/distance: " << coll.end()-coll.begin() << endl;  
  30.    /* print all elements 
  31.     * - NOTE: uses operator < instead of operator != 
  32.     */
  33.    vector<int>::iterator pos;  
  34.    for (pos=coll.begin(); pos<coll.end(); ++pos)  
  35.    {  
  36.        cout << *pos << ' ';  
  37.    }  
  38.    cout << endl;  
  39.    /* print all elements 
  40.     * - NOTE: uses operator [] instead of operator * 
  41.     */
  42.    for (int i=0; i<coll.size(); ++i)  
  43.    {  
  44.        //cout << coll.begin()[i] << ' '; 和如下語句效果相同
  45.        cout << coll[i] << ' ';  
  46.    }  
  47.    cout << endl;  
  48.    /* print every second element 
  49.     * - NOTE: uses operator += 
  50.     */
  51.    for (pos = coll.begin(); pos < coll.end()-1; pos += 2)  
  52.    {  
  53.        cout << *pos << ' ';  
  54.    }  
  55.    cout << endl;  
  56. }  
  57. /******************************************** 
  58. 執行結果: 
  59. number/distance: 23 
  60. 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 
  61. 2007 2008 2009 2010 2011 2012 2013 
  62. 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 
  63. 2007 2008 2009 2010 2011 2012 2013 
  64. 1991 1993 1995 1997 1999 2001 2003 2005 2007 2009 2011 
  65. *********************************************/
  66. void test_advance()  
  67. {  
  68.     list<int> coll;  
  69.     // insert elements from 1 to 9
  70.     for (int i=2007; i<=2014; ++i)  
  71.     {  
  72.         coll.push_back(i);  
  73.     }  
  74.     //列印整個連結串列
  75.     print(coll,"print the list as follow:\n");  
  76.     list<int>::iterator pos = coll.begin();  
  77.     // print actual element
  78.     cout<<endl;  
  79.     cout << *pos << endl;  
  80.     // step three elements forward
  81.     cout<<endl<<"after advance (pos, 3)\n";  
  82.     advance (pos, 3);  
  83.     // print actual element
  84.     cout << *pos << endl;  
  85.     // step one element backward
  86.     cout<<endl<<"after advance (pos, -1)\n";  
  87.     advance (pos, -1);  
  88.     // print actual element
  89.     cout << *pos << endl;  
  90. }  
  91. /******************************************** 
  92. 執行結果: 
  93. print the list as follow: 
  94. 2007 2008 2009 2010 2011 2012 2013 2014 
  95. 2007 
  96. after advance (pos, 3) 
  97. 2010 
  98. after advance (pos, -1) 
  99. 2009 
  100. *********************************************/
  101. void test_distance()  
  102. {  
  103.     list<int> coll;  
  104.     // insert elements from -3 to 9
  105.     for (int i=2007; i<=2014; ++i)  
  106.     {  
  107.         coll.push_back(i);  
  108.     }  
  109.     print(coll,"print the list as follow:\n");  
  110.     // search element with value 2010
  111.     list<int>::iterator pos;  
  112.     pos = find (coll.begin(), coll.end(),    // range
  113.                 2010);                          // value
  114.     if (pos != coll.end())  
  115.     {  
  116.         // process and print difference from the beginning
  117.         cout << "difference between beginning and 2010: "
  118.              << distance(coll.begin(),pos) << endl;  
  119.     }  
  120.     else
  121. 相關推薦

    C++標準模板 iterator

    [cpp] view plaincopyprint? #include <vector> #include <iostream> #include <list> #include <

    C++標準模板---介紹iterator、const_iterator

    迭代器 概念:C++的一種機制,用來遍歷標準模板庫容器中的元素,是一種"智慧"指標 一、迭代器的特點 迭代器是一種智慧指標,具有遍歷複雜資料結構的能力 不同的容器有不一樣的內部結構,因此會有一樣的迭代器型別 迭代器定義後,並不屬於某一例項容器物件,只要是屬於該迭代器

    c++Iterator

    1 C++ Iterators(迭代器) 迭代器可被用來訪問一個容器類的所包函的全部元素,其行為像一個指標。 舉一個例子,你可用一個迭代器來實現對vector容器中所含元素的遍歷。有這麼幾種迭代器如下: 迭代器 描述 input_iterator   提供讀功能的向前移動迭

    rust (iterator)

    翻譯來源 這篇文章的目的是為一些常見的iterator提供參考資料。並不能替代Iterator API或者書中的Rust iterator核心概念 ,事實上這篇文章的內容來自以上兩種內容。 為了更好理解本篇文章內容,推薦讀者至少粗略瞭解Rust

    Java(iterator以及和for迴圈的區別)

    前言:        迭代器是一種模式、詳細可見其設計模式,可以使得序列型別的資料結構的遍歷行為與被遍歷的物件分離,即我們無需關心該序列的底層結構是什麼樣子的。只要拿到這個物件,使用迭代器就可以遍歷這個物件的內部。Iterable:實現這個介面的集合物件支援迭代,是可以迭代的

    設計模式之與組合模式

    很高興,這本書總共13章,這次已經是到第9章了;同時也很遺憾,小編脫離了書本,還是不知道如何描述一個設計模式。就比如迭代器與組合模式,原書篇幅比較長,小編儘量通俗易懂些,不到之處,還請各位小夥伴參考原書,小編也歡迎和大家一起交流。 有許多種方法可以把物件堆起來成為一個集合(collection)。你可以把它們

    STM32編碼模式---理論

    編碼器介面模式 選擇編碼器介面模式的方法是:如果計數器只在TI2的邊沿計數,則置TIMx_SMCR暫存器中的SMS=001;如果只在TI1邊沿計數,則置SMS=010;如果計數器同時在TI1和TI2邊沿計數,則置SMS=011。 通過設定TIMx_CCER暫存

    C++容器vector和iterator

    vector是同一種物件的集合,每個物件都有一個對應的整數索引值。和string物件一樣,標準庫將負責管理與儲存元素相關的類存。引入標頭檔案#include<vector>1.vector物件的定義和初始化[cpp]vector<T> v1      

    C++ STL使用

    寫在前面,迭代器這種東西,就是為了使訪問簡單!! 容器::iterator iter; for(iter= 容器.begin();iter!=容器.end();iter++){ cout<<*iter或者是 iter->first等等之類的    

    Python中的iterator和yield生成器(constructor

    什麼叫迭代器和可迭代物件? 一、可迭代物件(Iterable) 可以直接作用於for迴圈的物件統稱為可迭代物件(Iterable)。 所有的Iterable均可以通過內建函式iter()來轉變為Iterator。 然後使用它的next()方法呼叫,直

    c++:back_inserter, front_inserter,inserter

    1.stl迭代器之配接器( Iterator Adapters) 迭代器(Iterators)是一個純抽象的概念:任何東西,只要其行為類似迭代器,它就是一個迭代器.也就是說,只有具備有迭代器的四種基本操作:取值(*),遞增(++) 比較(== !=) 賦值(=)它就是迭代器

    Iterator()的一般用法

    迭代器(Iterator)   迭代器是一種設計模式,它是一個物件,它可以遍歷並選擇序列中的物件,而開發人員 不需要了解該序列的底層結構。迭代器通常被稱為“輕量級”物件,因為建立它的代價小。 Java中的Iterator功能比較簡單,並且只能單向移動:   (1) 使用方法

    與組合模式轉載

    程式碼實在太多了,偷個懶轉載大佬的 https://www.cnblogs.com/lzhp/p/3427704.html 迭代器模式 提供了一種方法順序訪問一個聚合物件中的各個元素,而又不暴露內部的表示 把在元素之間遍歷的責任交給迭代器,而不是聚合物件 角色

    什麼是,舉例

    2018年11月05日 20:30:11 HZY199321 閱讀數:5 個人分類: 個人成長

    設計模式之與組合模式

    在上次的文章中,我們通過層層引導,已經知道了迭代器模式的由來。現在我們再好好總結下。 關於迭代器模式,你所需要知道的第一件事情,就是它依賴於一個名為迭代器的介面。這是一個可能的迭代器的介面: 現在,我們一旦有了這個介面,就可以為各種物件集合實現迭代器:陣列、列表、散列表...如果我麼想要為陣列實現迭代器,

    設計模式之與組合模式

    現在我們已經能愉快地看著一頁一頁羅列出來的選單進行點菜了。現在又有的小夥伴希望能夠加上一份餐後甜點的“子選單”。怎麼辦呢?我們不僅僅要支援多個選單,甚至還要支援選單中的選單。 如果我們能讓甜點選單變成餐廳選單集合的一個元素,那該有多好。但是根據現在的實現,根本做不到呀。我們想要的是這樣的: 我們需要什麼

    設計模式之與組合模式

    因為這系列篇幅較長,所以在這裡也不進行任何鋪墊,直奔主題去啦。 利用組合設計選單 我們要如何在選單上應用組合模式呢?一開始,我們需要建立一個元件介面來作為選單和選單項的共同介面,讓我們能夠用統一的做法來處理選單和選單項。換句話說,我們可以針對選單或選單項呼叫相同的方法。 讓我們從頭來看看如何讓選單能夠符合組合

    C++ 模板

    C++模板   模板是C++支援引數化多型的工具,使用模板可以使使用者為類或者函式宣告一種一般模式,使得類中的某些資料成員或者成員函式的引數、返回值取得任意型別。   模板是一種對型別進行引數化的工具;   通常有兩種形式:函式模板和類模板;   函式模板針對僅引

    C++之模板

    C++模板   模板是C++支援引數化多型的工具,使用模板可以使使用者為類或者函式宣告一種一般模式,使得類中的某些資料成員或者成員函式的引數、返回值取得任意型別。   模板是一種對型別進行引數化的工具;   通常有兩種形式:函式模板和類模板;   函式模板針對僅引數型別不同的函式;   類模板針對僅資料成

    C++之類模板

    C++ 除了支援函式模板,還支援類模板(Class Template)。函式模板中定義的型別引數可以用在函式宣告和函式定義中,類模板中定義的型別引數可以用在類宣告和類實現中。類模板的目的同樣是將資料的型別引數化。 宣告類模板的語法為: template<typenam