除了為每個容器定義的迭代器以外,標準庫在標頭檔案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 我們原本是希望編寫乙個函式,...