天天看點

【C++ STL應用與實作】18: 怎樣使用疊代器擴充卡

本系列文章的檔案夾在這裡:檔案夾. 通過檔案夾裡能夠對STL整體有個大概了解

前言

本文介紹了STL中的疊代器擴充卡(iterator adapter)的概念及其用法示範樣例。疊代器擴充卡能夠和标準庫中的算法配合使用,達到一些特殊的效果。

疊代器擴充卡分為以下幾類:

reverse iterator : 反向疊代器

insert iterator : 插入型疊代器

stream iterator : 流疊代器

move iterator : 移動型疊代器

reverse iterator 反向疊代器

顧名思義。reverse就是反其道而行之。正常的疊代器是從前往後的方向遞增,而反向疊代器則是從後向前遞增的。

支援雙向疊代的容器通常都有rbegin(), rend()這對接口。它們的傳回值就是reverse iterator。使用這對反向疊代器來周遊容器就會實作從後向前的效果。

<code></code>

<code>// 這樣的設計的優點是對于區間的反向操作非常easy: array&lt;int, 5&gt;::reverse_iterator rEnd(a.end()); // rEnd also point to physical location: a.end(), // but its logical location is a.end() - 1, so equal to 5. EXPECT_EQ(5, *rEnd); // reverse range. auto posA = find(a.begin(), a.end(), 2); auto posB = find(a.begin(), a.end(), 5); pln("in normal order: "); copy(posA, posB, ostream_iterator&lt;int&gt;(cout, " ")); cr; array&lt;int, 5&gt;::reverse_iterator rPosA(posA); array&lt;int, 5&gt;::reverse_iterator rPosB(posB); pln("in reverse order: "); copy(rPosB, rPosA, ostream_iterator&lt;int&gt;(cout, " ")); cr; // 使用base()函數來把一個反向疊代器轉為正向疊代器 auto recoverPos = rpos1.base(); EXPECT_EQ(5, *recoverPos); END_TEST;</code>

insert iterator 插入型疊代器

插入型疊代器能夠使标準庫中算法對元素進行指派操作的語義轉化為對元素的插入操作語義。由于它們會改變容器,它們須要使用一個容器來初始化,如以下的代碼所看到的:

插入型疊代器分為以下三種:

會對初始化它的容器調用<code>push_back</code>以完畢後面插入元素的操作。

與<code>back_insert_iterator</code>相似。此疊代器調用容器的<code>push_front</code>來完畢在前面插入元素的操作。

最後這樣的插入型疊代器是最通用的疊代器, 它對容器調用insert(value, pos)方法。使得沒有<code>push_back</code>, <code>push_front</code>操作的容器,比方關聯式容器能夠使用這樣的疊代器。它相對于前兩種擴充卡,須要一個額外的參數pos以訓示插入位置。

stream iterator 流疊代器

分為:<code>ostream_iterator</code>和<code>istream_iterator</code>.

move iterator

since C++11, 移動語義的提出大大提高了一些涉及到轉發參數的函數調用過程之中(perfect forwarding完美轉發)參數傳遞的效率,通過把元素内部底層的東西移動到新的元素來避免拷貝開銷。

由于這個原因也提供了移動的疊代器擴充卡以實作須要移動語義的場合,以下是一段示意的代碼:

源代碼與參考連結

<code>iterator_adapter_test.cpp.cpp</code>

<code>reverse_iterator</code>

<code>back_insert_iterator</code>

<code>front_insert_iterator</code>

<code>insert_iterator</code>

<code>istream_iterator</code>

<code>ostream_iterator</code>

<code>make_move_iterator</code>

作者水準有限,對相關知識的了解和總結難免有錯誤,還望給予指正,非常感謝!

歡迎訪問github部落格,與本站同步更新