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

千張筆記

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

【原】Iterator淺析(Input Iterator)

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

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

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

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

Iterator是指針的概括物,它們是"用來指向其他對象"的一種對象,這對于像find這樣的泛型算法很重要,因?yàn)樗麄兛梢杂脕碓趯ο髤^(qū)間內(nèi)"來回移動(iterate)"。

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

Iterator不單單只是一個(gè)concept,而是五個(gè)不同的concepts:Input Iterator,Output Iterator,F(xiàn)orward Iterator,Bidirectional Iterator和Random Access Iterator。

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

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

3.Input Iterator可以被復(fù)制或被賦值。在調(diào)用一個(gè)函數(shù)時(shí),可以用傳值的方式傳入?yún)?shù),如find的參數(shù)first和last就是兩個(gè)Iterator,可以用傳值來傳入?yún)?shù),這會掉用Iterator的copy constructor。

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

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

注意:
1.Input Iterator用來指向某對象,但不需要提供任何更改該對象的方法。可以提領(lǐng)一個(gè)Input Iterator,但不能對提領(lǐng)后的結(jié)果賦予新值,也就是說表達(dá)式*p=x不一定有效。

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

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

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

舉例:
1.template<class InputIterator, class T> inline
     InputIterator find(InputIterator first, InputIterator last, const T& value)
上面為泛型算法find的定義,可以看見find的前兩個(gè)參數(shù)都為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中的一個(gè)型別,它是T0的別名,至于T0是在哪里定義的,可以參考vc98目錄下Include中的VECTOR文件,定義如下:(注意此定義與MSDN中的定義的區(qū)別
///////////////////////////////////////////////////////////////////////////////////////
.......
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是一個(gè)指針類型
 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是一個(gè)指向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 << "請輸入整數(shù)序列,按任意非數(shù)字鍵并回車結(jié)束輸入: \n";
    copy(istream_iterator<int>(cin),istream_iterator<int>(),back_inserter(V));
    cout << "排序中......" << endl;
    sort(V.begin(),V.end());
    cout << "下面顯示經(jīng)過排序的序列: \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>
            亚洲影视在线| 久久亚洲精品欧美| 久久久五月婷婷| 亚洲片在线资源| 久久青草福利网站| 国产精品日日摸夜夜添夜夜av| 欧美成人激情视频免费观看| 精久久久久久| 另类亚洲自拍| 亚洲精品日日夜夜| 亚洲欧美日韩综合aⅴ视频| 国产欧美日韩精品丝袜高跟鞋| 久久9热精品视频| 欧美二区在线播放| 亚洲图中文字幕| 国产亚洲欧美激情| 欧美ed2k| 羞羞漫画18久久大片| 另类尿喷潮videofree| 亚洲区国产区| 国产日韩欧美黄色| 欧美成人资源| 午夜精品一区二区三区在线 | 欧美电影电视剧在线观看| 日韩视频在线观看免费| 国产精品扒开腿做爽爽爽视频| 欧美亚洲专区| 一本色道久久99精品综合 | 亚洲欧美文学| 亚洲高清中文字幕| 亚洲一区二区三区四区视频| 亚洲午夜精品国产| 国产综合精品| 欧美性淫爽ww久久久久无| 久久九九免费视频| 一区二区三区欧美亚洲| 久久久亚洲欧洲日产国码αv | 午夜日韩在线观看| 亚洲片在线资源| 国产午夜精品麻豆| 欧美三级中文字幕在线观看| 欧美在线视频日韩| 在线视频亚洲一区| 欧美91大片| 久久中文精品| 久久精品视频导航| 亚洲精品社区| 亚洲精品日韩在线| 欧美亚洲视频一区二区| 一区二区欧美日韩| 好吊日精品视频| 国产精品久久国产精品99gif| 久久综合久色欧美综合狠狠 | 久久天天躁狠狠躁夜夜爽蜜月| 一区二区三区四区蜜桃| 亚洲精品乱码久久久久久按摩观| 久久伊人一区二区| 久久精品一本| 久久乐国产精品| 欧美一区不卡| 性欧美大战久久久久久久久| 亚洲专区免费| 新片速递亚洲合集欧美合集| 亚洲一区自拍| 欧美专区在线| 久久久久久久性| 久久久欧美精品sm网站| 欧美综合第一页| 免费在线观看一区二区| 国产日韩一区二区三区| 国产精品一区免费视频| 久久香蕉国产线看观看av| 国产精品视频导航| 国产精品国产精品| 国产精品女人网站| 韩国精品久久久999| 经典三级久久| 一本到12不卡视频在线dvd| 一二三区精品福利视频| 亚洲一区二区三区四区在线观看 | 亚洲尤物影院| 欧美激情黄色片| 欧美日韩国产不卡| 国产精品一区二区欧美| 国产亚洲欧美另类中文| 亚洲黄页一区| 亚洲一区国产一区| 久久久999国产| 欧美二区不卡| 亚洲天堂男人| 欧美成人免费在线视频| 国产精品日韩一区二区三区| 国产视频一区三区| 最新国产の精品合集bt伙计| 亚洲一二区在线| 久久久91精品国产| 亚洲毛片av在线| 99国产精品国产精品毛片| 午夜精品久久久久久久蜜桃app| 午夜精品久久久久久久男人的天堂| 亚洲国产成人精品女人久久久| 亚洲精品麻豆| 欧美一区二区播放| 亚洲国产精品综合| 欧美一区免费视频| 欧美日韩一区二区三区四区在线观看 | 香蕉av福利精品导航| 久久久亚洲欧洲日产国码αv| 亚洲国产裸拍裸体视频在线观看乱了中文 | 亚洲女同同性videoxma| 久久久久久亚洲精品中文字幕| 欧美黄色aaaa| 有码中文亚洲精品| 久久国产精品久久久久久电车| 欧美国产日韩一区二区在线观看| 亚洲在线国产日韩欧美| 欧美日韩中国免费专区在线看| 尤物视频一区二区| 久久精品五月| 亚洲欧美综合v| 欧美体内she精视频| 亚洲人成网站色ww在线| 老鸭窝毛片一区二区三区| 久久成人在线| 国产精品久久久久aaaa九色| 亚洲日韩中文字幕在线播放| 久久久亚洲影院你懂的| 亚洲综合欧美| 国产精品自拍小视频| 亚洲午夜精品久久| 一本久道久久综合中文字幕| 欧美久久久久免费| 亚洲精选久久| 亚洲三级毛片| 欧美日韩激情小视频| 99精品国产福利在线观看免费| 久久久另类综合| 午夜精品区一区二区三| 欧美精品v日韩精品v国产精品 | 亚洲第一区中文99精品| 国产伪娘ts一区| 久久精品一区二区三区中文字幕| 一区二区三区日韩精品视频| 欧美日韩一区二区在线观看视频| 亚洲日本电影| 国产欧美在线看| 国产亚洲观看| 久久久青草青青国产亚洲免观| 香蕉免费一区二区三区在线观看| 欧美日韩免费观看中文| 日韩一级黄色片| 亚洲日本中文字幕| 欧美日本成人| 亚洲一区二区综合| 亚洲欧美国内爽妇网| 国产婷婷一区二区| 欧美国产亚洲精品久久久8v| 欧美成人一区二免费视频软件| 亚洲精品一区二区三| 99国产精品99久久久久久| 欧美久久久久免费| 午夜精品久久久久久久99水蜜桃 | 欧美日韩综合一区| 亚洲欧美精品在线观看| 午夜亚洲视频| 亚洲国产美女精品久久久久∴| 亚洲二区在线| 国产精品成人av性教育| 久久久精品国产一区二区三区 | 国产偷国产偷精品高清尤物| 久久久亚洲人| 免费在线观看成人av| 亚洲天堂av综合网| 午夜激情亚洲| 亚洲精品久久久久久下一站| 日韩视频二区| 在线成人激情黄色| 国产精品99久久久久久有的能看| 激情六月综合| 亚洲国产另类久久久精品极度| 日韩小视频在线观看专区| 国产一区二区精品久久99| 亚洲毛片av| 在线看一区二区| 亚洲男人av电影| 亚洲资源av| 亚洲日本中文字幕区| 欧美一区二区日韩一区二区| 亚洲欧洲一二三| 久久国产综合精品| 欧美亚洲免费高清在线观看| 免费h精品视频在线播放| 欧美亚洲视频一区二区| 欧美日韩一区二区三区免费看| 久久天天躁狠狠躁夜夜av| 欧美日韩国产欧| 亚洲激情电影中文字幕| 国内成人自拍视频| 亚洲自拍高清| 久久av资源网站|