青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

千張筆記

Email:rain_qian830@163.com
posts - 28, comments - 42, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

【原】Iterator淺析(Input Iterator)

Posted on 2009-02-25 23:00 千張 閱讀(2237) 評論(0)  編輯 收藏 引用 所屬分類: C++/VS.NET

讀<泛型編程與STL>第二章

所謂concept,是一組“描述某個型別”的條件。當某個型別滿足所有這樣的條件,我們便說它是該concept的一個model。舉例來說,char* 便是Input Iterator的model。

concept并不是類,變量或是template參數,事實上它不是可以直接在C++程序中呈現的東西。然而在每個運用"泛型編程(generic programming)"的C++程序中,concept非常重要。也就是說concept不像class,int那樣有一個明確的關鍵字,可以在程序中直接聲明其對象的,它只是一組條件,作為一個concept的model,它必須滿足這個concept的所有條件。

Iterator是指針的概括物,它們是"用來指向其他對象"的一種對象,這對于像find這樣的泛型算法很重要,因為他們可以用來在對象區間內"來回移動(iterate)"。

Iterator對于泛型編程之所以重要,原因是它是算法與數據結構之間的接口。類似find這樣的算法,以iterator為引數,便可以作用在許許多多不同的數據結構上-即使彼此結構不同(例如鏈表與C數組)。我們僅僅要求:iterator能夠以某種線性順序遍歷某個數據結構,以訪問其中所有的元素。

Iterator不單單只是一個concept,而是五個不同的concepts:Input Iterator,Output Iterator,Forward Iterator,Bidirectional Iterator和Random Access Iterator。

<一> Input Iterator
本質上,Input Iterator是某種類似指針的東西,并且在我們談到iterator range[first,last)時有意義:
1.當它作為一般的C指針時,有三種價值:它是dereferenceable(可取值的),past the end(可跨越尾端的),singular(可為null的)。當它作為指針,只有在first和last都不為null指針時,[first,last)才是有意義的range。

2.我們可以比較型別為Iterator的兩個對象的相等性。例如:while(first!=last)。

3.Input Iterator可以被復制或被賦值。在調用一個函數時,可以用傳值的方式傳入參數,如find的參數first和last就是兩個Iterator,可以用傳值來傳入參數,這會掉用Iterator的copy constructor。

4.可以提領(dereference)一個型別為Iterator的對象。也就是說,表達式*p有充分的定義。每一個Input Iterator都有一個associated value type,那是它所指的對象的型別。

5.可以對一個型別為Iterator的對象進行累加動作。也就是說,表達式++p和p++都有充分定義。

注意:
1.Input Iterator用來指向某對象,但不需要提供任何更改該對象的方法??梢蕴犷I一個Input Iterator,但不能對提領后的結果賦予新值,也就是說表達式*p=x不一定有效。

2.Input Iterator可以累加,但并非一定需要遞減。Input Iterator唯一需要的運算形式是operator++。

3.可以測試兩個Input Iterator是否相等,但不能測試誰在誰之前。也就是說p1<p2不一定成立(p1,p2都是Input Iterator)。

4.Input Iterator的唯一正確使用方式是線性查找,這是一種"single pass(單回)"算法,它只遍歷range[first,last)一次,并對range中的值最多讀取一次。也就是說,遍歷時只能像前(++),不能退后,前一個遍歷的值不再有效。不能以兩個iterator指向"由Input iterator形成的range"中的兩個不同元素。

舉例:
1.template<class InputIterator, class T> inline
     InputIterator find(InputIterator first, InputIterator last, const T& value)
上面為泛型算法find的定義,可以看見find的前兩個參數都為InputIterator類型的Iterator。
sample如下:


#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
    int size = 8;
    vector<int> vec(size);
    vector<int>::iterator iter = vec.begin();
    for(int ix = 0; iter != vec.end(); ++iter,++ix)
        *iter = ix;
   
    cout << "Array = { ";
    for(vector<int>::iterator iter2 = vec.begin(); iter2 != vec.end(); ++iter2)
        cout << *iter2 <<",";
    cout << "}" << endl;

    vector<int>::iterator location;
    int value = 7;
    location = find(vec.begin(),vec.end(),value);
    if(location != vec.begin() + vec.size())
        cout << "First element that matches " << value << " is at location " << location - vec.begin() << endl;
    else
        cout << "The sequence doesn't contain any elements with value " << value << endl;
   
    return 0;
}

MSDN中定義
vector::iterator
typedef T0 iterator; 說明iterator是vector中的一個型別,它是T0的別名,至于T0是在哪里定義的,可以參考vc98目錄下Include中的VECTOR文件,定義如下:(注意此定義與MSDN中的定義的區別
///////////////////////////////////////////////////////////////////////////////////////
.......
template<class _Ty, class _A = allocator<_Ty> >
 class vector {
public:
 typedef vector<_Ty, _A> _Myt;
 typedef _A allocator_type;
 typedef _A::size_type size_type;
 typedef _A::difference_type difference_type;
 typedef _A::pointer _Tptr;
 typedef _A::const_pointer _Ctptr;
 typedef _A::reference reference;
 typedef _A::const_reference const_reference;
 typedef _A::value_type value_type;
 typedef _Tptr iterator;         //MSDN中此處_Tptr換成了T0,可知iterator是一個指針類型
 typedef _Ctptr const_iterator;
//////////////////////////////////////////////////////////////////////////////////////////

在MSDN中有如下說明:
The object allocates and frees storage for the sequence it controls through a protected object named allocator, of class A. Such an allocator object must have the same external interface as an object of template class allocator.
而class allocator_object中是這樣說明pointer的:
pointer -- behaves like a pointer to T
所以iterator是一個指向T類型的指針,在本sample中,T是int類型,故iterator是int類型的指針。

2.istream_Iterator
istream_Iterator是一種Input Iterator。sample如下:
//輸入--排序--輸出
#include <iostream>
#include <string> 
#include <vector>
#include <algorithm>
#include <iterator>

using namespace std;

int main()
{
     vector<int> V;
    cout << "請輸入整數序列,按任意非數字鍵并回車結束輸入: \n";
    copy(istream_iterator<int>(cin),istream_iterator<int>(),back_inserter(V));
    cout << "排序中......" << endl;
    sort(V.begin(),V.end());
    cout << "下面顯示經過排序的序列: \n";
    copy(V.begin(),V.end(),ostream_iterator<int>(cout," "));
    cout << endl;
    return 0;
}
代碼具體解釋可參考Clare的blog:
http://www.cnblogs.com/oomusou/archive/2006/12/07/585123.html

 

 

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩三级视频| 国产午夜一区二区三区| 91久久嫩草影院一区二区| 免费观看30秒视频久久| 蜜臀久久99精品久久久久久9 | 亚洲一级在线观看| 国产精品久久久久天堂| 欧美在线视频免费播放| 久久gogo国模裸体人体| 亚洲国产成人一区| 亚洲精品视频一区二区三区| 国产精品久久久久毛片大屁完整版| 亚洲伊人伊色伊影伊综合网| 午夜精品久久久久影视| 国产综合婷婷| 欧美激情亚洲自拍| 国产精品www994| 久久免费视频这里只有精品| 欧美+日本+国产+在线a∨观看| 一区二区三区导航| 午夜精品亚洲| 日韩视频一区二区三区在线播放| 在线亚洲一区二区| 在线观看欧美一区| 亚洲图片欧洲图片av| 在线播放亚洲一区| 在线视频一区二区| 亚洲国产精品高清久久久| 野花国产精品入口| 亚洲高清免费| 亚洲综合二区| 99精品久久久| 久久久久国色av免费看影院 | 在线欧美视频| 国产精品99久久久久久白浆小说| 一区二区三区中文在线观看 | 欧美r片在线| 国产精品无码专区在线观看| 欧美激情视频在线播放 | 尹人成人综合网| 亚洲视频一区在线| 亚洲欧洲精品一区二区三区波多野1战4 | 欧美在线播放一区二区| 中文精品视频| 免播放器亚洲| 久热国产精品| 国产一区二区三区久久精品| 一区二区三区视频在线播放| 亚洲精选一区| 免费在线亚洲| 久久久久久久久久久一区| 国产精品久久久一区二区三区| 欧美激情一区二区三区成人| 国外成人网址| 欧美一区二区三区四区视频| 香港成人在线视频| 欧美性猛片xxxx免费看久爱 | 欧美国产欧美亚洲国产日韩mv天天看完整| 国产美女扒开尿口久久久| 日韩午夜在线视频| 一本色道久久88精品综合| 欧美xxx在线观看| 欧美国产成人精品| 亚洲国产三级网| 蜜臀91精品一区二区三区| 欧美成人三级在线| 亚洲国产精品成人精品| 久久综合九色九九| 欧美成人免费播放| 亚洲精品免费电影| 欧美华人在线视频| 亚洲精选视频在线| 亚洲一区www| 国产精品蜜臀在线观看| 亚洲一级片在线看| 久久精品视频播放| 伊人春色精品| 欧美国产日韩a欧美在线观看| 亚洲国产一区二区三区a毛片 | 国产精品videosex极品| 国产精品99久久久久久有的能看| 亚洲欧美日韩在线一区| 国产欧美精品国产国产专区| 欧美在线观看视频一区二区| 蜜月aⅴ免费一区二区三区| 91久久综合亚洲鲁鲁五月天| 欧美女同视频| 亚洲欧美日韩国产综合在线| 久久亚洲电影| 99精品欧美一区二区三区综合在线 | 久久日韩粉嫩一区二区三区| 欧美性一区二区| 亚洲一区美女视频在线观看免费| 亚洲欧美日韩国产一区二区三区| 国产欧美日韩不卡免费| 久久精品成人| 亚洲国产成人在线视频| 亚洲视频碰碰| 国产一区二区0| 欧美不卡一卡二卡免费版| 一区二区三区视频观看| 蜜臀久久99精品久久久画质超高清| 亚洲欧洲综合另类| 国产麻豆91精品| 欧美成人激情在线| 亚洲女女女同性video| 欧美激情综合色| 久久黄色网页| 一本色道久久| 亚洲国产成人高清精品| 国产精品久久夜| 欧美va天堂va视频va在线| 亚洲欧美国产不卡| 亚洲精品国产精品乱码不99按摩| 久久久久国产一区二区三区| 一本色道88久久加勒比精品| 精品不卡一区二区三区| 国产精品一区在线观看你懂的| 欧美国产综合| 快播亚洲色图| 韩曰欧美视频免费观看| 欧美激情小视频| 欧美亚洲免费电影| 艳妇臀荡乳欲伦亚洲一区| 激情av一区| 国产欧美亚洲一区| 欧美色图五月天| 欧美精品一区二区三区高清aⅴ| 久久精品二区三区| 午夜在线精品| 一区二区欧美视频| 日韩视频在线一区二区| 亚洲第一区在线观看| 久久综合999| 久久亚洲一区| 久久精品在线| 久久久久国内| 久久久久久免费| 久久久免费av| 久久久国产精品一区二区中文 | 国产精品自拍在线| 国产精品久久久久久av下载红粉| 欧美激情第1页| 欧美另类一区| 欧美日韩免费观看一区| 欧美日韩国产专区| 欧美深夜影院| 国产精品青草久久久久福利99| 国产精品萝li| 国产一区99| 在线看不卡av| 99re6热在线精品视频播放速度| 亚洲精品一区二区三区av| 99re66热这里只有精品4| 99精品99| 欧美一区二区三区四区视频| 久久精品女人的天堂av| 久久久人成影片一区二区三区观看| 久久久久久久综合日本| 欧美mv日韩mv国产网站| 亚洲欧洲一区二区三区在线观看| 亚洲精选视频免费看| 亚洲夜间福利| 久久久水蜜桃| 欧美日韩国产不卡在线看| 国产精品v日韩精品v欧美精品网站| 国产精品日本| 亚洲丰满少妇videoshd| 亚洲视频一区在线| 久久久久久久综合日本| 亚洲国产岛国毛片在线| 亚洲一区二区三区中文字幕| 久久久久久网站| 欧美三级在线播放| 国产有码一区二区| 日韩亚洲在线观看| 久久精品视频免费播放| 亚洲激情视频在线观看| 亚洲欧美日韩在线观看a三区| 久久欧美中文字幕| 国产精品jvid在线观看蜜臀| 国产综合在线视频| 在线一区二区三区四区五区| 久久久久久自在自线| 亚洲七七久久综合桃花剧情介绍| 亚洲免费在线观看视频| 欧美a级片网| 国产亚洲福利| 亚洲视频电影图片偷拍一区| 久久婷婷av| 一区二区久久| 欧美暴力喷水在线| 国产午夜精品全部视频播放| 一本久道综合久久精品| 欧美1区免费| 欧美一区国产在线| 国产精品久久一卡二卡| 99国产精品久久久久久久成人热| 久久久久久一区| 午夜精品视频在线观看一区二区|