頭文件<iterator>中的迭代器

頭文件<iterator>中定義了四種迭代器:

  1. 插入迭代器(insert iterator):這些迭代器被綁定到一個容器上,可向容器插入元素铣除。
  2. 流迭代器(stream iterator):這些迭代器被綁定到輸入或輸出流上问慎,可用來遍歷關聯(lián)的IO流嫡良。
  3. 反向迭代器(reverse iterator):這些迭代器向后而不是向前移動绢涡。除了forward_list之外的標準庫容器都有反向迭代器。
  4. 移動迭代器(move iterator):這些專用的迭代器不是拷貝其中的元素纹冤,而是移動它們洒宝。

插入器是一種迭代器適配器,它接受一個容器萌京,生成一個迭代器雁歌,能實現(xiàn)向給定容器添加元素。當我們通過一個插入迭代器進行賦值時知残,該迭代器調用容器操作來向給定容器的指定位置插入一個元素靠瞎。it = t; 即在it指定的當前位置插入值t。假定c是it綁定的容器求妹,依賴于插入迭代器的不同種類乏盐,此賦值會分別調用c.push_back(t), c.push_front(t)或c.insert(t, p), 其中p為傳遞給inserter的迭代器位置制恍。

與上面相對應父能,插入器有三種類型,back_inserter, front_inserter, inserter吧趣,差異在于元素插入的位置法竞。

list<int> lst = {1, 2, 3, 4};
list<int> lst2, lst3;
//拷貝完成之后,lst2包含4 3 2 1
copy(lst.cbegin(), lst.cend(), front_inserter(lst2) );
//拷貝完成之后强挫,lst3包含1 2 3 4
copy(lst.cbegin(), lst.cend(), inserter(lst3, lst3.begin() ) );

iostream迭代器岔霸,istream_iterator讀取輸入流,ostream_iterator向一個輸入流中寫數(shù)據(jù)俯渤。這些迭代器呆细,將他們對應的流當做一個特定類型的元素序列來處理。通過使用流迭代器八匠,我們可以用泛型算法從流對象讀取數(shù)據(jù)以及向其寫入數(shù)據(jù)絮爷。

istream_iterator的一些操作

istream_iterator<int> int_it(cin);
istream_iterator<int> int_eof;
ifstream in("afile");
istream_iterator<string> str_it(in);

istream_iterator<int> in_iter(cin);
istream_iterator<int> eof;
while (in_iter != eof)
    //后置遞增運算讀取流,返回迭代器的舊值
    //解引用迭代器梨树,獲得從流讀取的前一個值
    vec.push_back(*in_iter++);

//上面的一小段程序可以重寫為如下形式:
istream_iterator<int> in_iter(cin), eof;
vector<int> vec(in_iter, eof);

//使用算法操作流迭代器
istream_iterator<int> in(cin), eof;
cout << accumulate(in, eof, 0) << endl;

istream_iterator允許懶惰求值坑夯,也即是當我們將一個istream_iterator綁定到一個流時,標準庫并不保證迭代器立即從流讀取數(shù)據(jù)抡四。具體實現(xiàn)可以推遲從流中讀取數(shù)據(jù)柜蜈,直到我們使用迭代器時才真正讀取。標準庫中的實現(xiàn)所保證的是指巡,在我們第一次解引用迭代器之前淑履,從流中讀取數(shù)據(jù)的操作已經(jīng)完成了。對于大多數(shù)程序來說藻雪,立即讀取還是推遲讀取沒什么差別秘噪。但是,如果我們創(chuàng)建了一個istream_iterator勉耀,沒有使用就銷毀了指煎,或者我們正在從兩個不同的對象同步讀取同一個流蹋偏,那么何時讀取可能就很重要了。

ostream_iterator創(chuàng)建時贯要,可以提供(可選的)第二參數(shù)暖侨,它是一個字符串,在輸出每個元素后都會打印此字符串崇渗。此字符串必須是一個C風格字符串(即字逗,一個字符串字面常量或者一個指向以空字符結尾的字符數(shù)組的指針)。必須將ostream_iterator綁定到一個指定的流宅广,不允許空的或表示尾后位置的ostream_iterator葫掉。

//用ostream_iterator來輸出值的序列
ostream_iterator<int> out_iter(cout, " ");
for(auto e : vec)
    *out_iter++ = e;
cout << endl;

//下面的程序與上面的等價
for(auto e : vec)
    out_iter = e;
cout << endl;

運算符*和++實際上對ostream_iterator對象不做任何事情,因此忽略它們對我們的程序沒有任何影響跟狱。但是俭厚,推薦第一種形式。在這種寫法中驶臊,流迭代器的使用與其他迭代器的使用保持一致挪挤。如果想將此循環(huán)改為操作其他迭代器類型,修改起來非常容易关翎。而且扛门,對于讀者來說,此循環(huán)的行為也更加清晰纵寝。

可以通過調用copy來打印vec中的元素论寨,這比編寫循環(huán)更為簡單:

copy(vec.begin(), vec.end(), out_iter);
cout << endl;

反向迭代器就是在容器中從尾元素向首元素反向移動的迭代器。對于反向迭代器爽茴,遞增(以及遞減)操作的含義會顛倒過來葬凳。遞增一個反向迭代器(++it)會移動到前一個元素;遞減一個元素(--it)會移動到下一個元素室奏。

反向迭代器與普通迭代器的關系火焰,rcomma如果是一個反向迭代器,那么rcomma.base()就是一個正向迭代器胧沫。

新標準庫中定義了一種移動迭代器(move iterator)適配器昌简,一個移動迭代器通過改變給定迭代器的解引用運算符的行為來適配此迭代器。一般來說琳袄,一個迭代器的解引用運算符返回一個指向元素的左值江场。與其他迭代器不同纺酸,移動迭代器的解引用運算符生成一個右值引用窖逗。
我們通過調用標準庫的make_move_iterator函數(shù)將一個普通迭代器轉換為一個移動迭代器。此函數(shù)接受一個迭代器參數(shù)餐蔬,返回一個移動迭代器碎紊。
原迭代器的所有其他操作在移動迭代器中都照常工作佑附。由于移動迭代器支持正常的迭代器操作,我們可以將一對移動迭代器傳遞給算法仗考。

值得注意的是音同,標準庫不保證哪些算法適用移動迭代器,哪些不適用秃嗜。由于移動一個對象可能銷毀原對象权均,因此你只有在確信算法在為一個元素賦值或將其傳遞給一個用戶定義的函數(shù)后不再訪問它時,才能將移動迭代器傳遞給算法锅锨。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末叽赊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子必搞,更是在濱河造成了極大的恐慌必指,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恕洲,死亡現(xiàn)場離奇詭異塔橡,居然都是意外死亡,警方通過查閱死者的電腦和手機霜第,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門葛家,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人庶诡,你說我怎么就攤上這事惦银。” “怎么了末誓?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵扯俱,是天一觀的道長。 經(jīng)常有香客問我喇澡,道長迅栅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任晴玖,我火速辦了婚禮读存,結果婚禮上,老公的妹妹穿的比我還像新娘呕屎。我一直安慰自己让簿,他們只是感情好,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布秀睛。 她就那樣靜靜地躺著尔当,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蹂安。 梳的紋絲不亂的頭發(fā)上椭迎,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天锐帜,我揣著相機與錄音,去河邊找鬼畜号。 笑死缴阎,一個胖子當著我的面吹牛,可吹牛的內容都是我干的简软。 我是一名探鬼主播蛮拔,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼痹升!你這毒婦竟也來了语泽?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤视卢,失蹤者是張志新(化名)和其女友劉穎踱卵,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體据过,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡惋砂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了绳锅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片西饵。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鳞芙,靈堂內的尸體忽然破棺而出眷柔,到底是詐尸還是另有隱情,我是刑警寧澤原朝,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布驯嘱,位于F島的核電站,受9級特大地震影響喳坠,放射性物質發(fā)生泄漏鞠评。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一壕鹉、第九天 我趴在偏房一處隱蔽的房頂上張望剃幌。 院中可真熱鬧,春花似錦晾浴、人聲如沸负乡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抖棘。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間钉答,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工杈抢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留数尿,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓惶楼,卻偏偏與公主長得像右蹦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子歼捐,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,506評論 1 51
  • 這周的課講了將泛型算法『温剑現(xiàn)在將泛型算法收集下,備用豹储。 (1)泛型算法用迭代器來解決第一個要求:遍歷容器贷盲。所有迭代器...
    shenhua8369閱讀 244評論 0 0
  • 標簽(空格分隔): STL 運用STL,可以充分利用該庫的設計剥扣,讓我為簡單而直接的問題設計出簡單而直接的解決方案巩剖,...
    認真學計算機閱讀 1,470評論 0 10
  • 從三月份找實習到現(xiàn)在,面了一些公司钠怯,掛了不少佳魔,但最終還是拿到小米、百度晦炊、阿里鞠鲜、京東、新浪断国、CVTE贤姆、樂視家的研發(fā)崗...
    時芥藍閱讀 42,192評論 11 349
  • 某天下午庐氮,我慵懶的躺在沙發(fā)上,目不轉睛的搗鼓著手機宋彼。把手機上的一堆游戲全部卸載弄砍,在應用市場無經(jīng)意間發(fā)現(xiàn)了“簡書”,...
    蘇滕閱讀 326評論 0 2