再探迭代器

2021-08-10 15:22:40 字數 2871 閱讀 3644

除了為每個容器定義的迭代器以外,標準庫在標頭檔案iterator中還定義了額外4種迭代器

插入迭代器流迭代器反向迭代器移動迭代器

插入器是一種迭代器介面卡,接受乙個容器,生成乙個插入迭代器

vector

vi;auto it = back_inserter(vi);

//back_inserter是插入器

//it是其生成的對應容器vi的插入器

對插入器賦值的時候,會自動向容器中新增元素

*it = 100;                     //將100插入vi尾部(插入型別由插入器決定)

cout

/輸出 1 100

插入迭代器定義了幾種操作

*it = t;                //在it指定位置插入值為t的元素,具體位置由插入器決定

/*--------*/

*it; //定義了這些操作,但不做任何事情,統一返回it

it++;

vector

v1=,v2;

auto back_it = back_inserter(v2);

copy(v1.begin(),v1.end(),back_it);

//v2中為 1 2 3 4

auto front_it = front_inserter(v2);

copy(v1.begin(),v1.end(),front_it);

//v2中為 4 3 2 1

//每次插入前都會更新插入位置確保總是在頭部插入

//插入1後,容器的頭就會重定位在1之前,所以2會插在1之前,以此類推

auto front_it = inserter(v2,v2.begin());

copy(v1.begin(),v1.end(),front_it);

//v2中為 1 2 3 4

由於插入位置是繫結不變的,所以插入位置的迭代器一旦失效就會造成異常

vector

v(10); //v有10個元素

auto it = inserter(v,v.end()); 在當前容器末尾,第10個元素後面

*it = 1; //ok

v.resize(5); //將容器大小縮小為5,原容器超過5的部位被刪除

*it = 2; //觸發異常,原來的位置已經被刪掉

首 vec.begin()

尾後 vec.end()

———反———

首前 vec.rbegin()

尾 vec.rend()

forward_list流迭代器沒有反向迭代器

string str = "hello, world, hello, cpp.";

auto punct_it = find(str.begin(), str.end(), ','); //普通迭代器

string::reverse_iterator re_it(punct_it); //用普通迭代器punct_it初始化re_it

cout

<< *punct_it << " "

<< *re_it << endl;

//輸出 , o

反向迭代器和普通迭代器並不指向同乙個位置

string str = "hello, world, hello, cpp.";

auto re_it = str.rend(); //反向迭代器 首前

auto it = re_it.base(); //獲取普通迭代器,同樣位置改變了

cout

<< *it << endl;

//輸出 h

上面兩個例子可以看出,普通迭代器和反向迭代器它們所指的元素是不同的

這樣的設計思路是:普通迭代器與反向迭代器的目的是表示元素範圍,而乙個約定俗成的規定是用 左閉右開 區間來表示乙個範圍 ,把開始的方向稱為左,結束的方向稱為右

STL之再探迭代器

迭代器被繫結到乙個容器上,可用來向容器插入元素。back inserter建立乙個使用push back的迭代器 front inserter建立乙個使用push front的迭代器 inserter建立乙個使用insert的迭代器,此函式接受哦第二個引數,這個引數必須是指向乙個給定容器的迭代器。元...

第十章 再探迭代器

1.插入迭代器 back inserter 插入時呼叫push back 容器得支援 front inserter 插入時呼叫push front 容器得支援,copy演算法作為目標容器會使序列顛倒 inserter inserter 容器,迭代器 表示插入的位置 例 it是由inserter生成的...

再探函式引數

c函式的所有引數均以 傳值呼叫 方式進行傳遞。這意味著函式將獲得引數值的乙份拷貝,這樣函式可以放心修改這個拷貝值,而不必擔心會修改呼叫程式實際傳遞給它的引數。普通資料型別主要包括 如下面 所示 include void swap int x int y int main 我們原本是希望編寫乙個函式,...