插入迭代器

2021-07-13 15:16:43 字數 2353 閱讀 7371

三種型別:

* front_inserter

* inserter

* back_inserter

需要容器支援對應的push_back\push_front操作。

參考在c++primer第四版,中文版p348頁中,大家應該都會對inserter和front_inserter這兩個函式的用法有點疑問吧,經過我的一番查證,測試和思考,總結出一點自己的想法,如有不當之處,請大家多多包涵。

原文中說道「在使用front_inserter時,元素始終在容器的第乙個元素插入。而使用inserter時,元素則在指定位置插入。即使此指定位置初始化為容器中的地乙個元素,但是,一旦在該位置前插入乙個新元素後,插入位置就不再是容器的首元素了。」在結合書本上面所寫道的:front_inserter,使用push_front實現插入,inserter,使用insert實現插入。然後我們去查閱了insert用法,發現插入成功返回的是新插入以後的迭代器!然後結合下面的實驗

#include

#include

#include

using

namespace

std;

int main()

copy(ilist1.begin(),ilist1.end(),front_inserter(ilist2));

copy(ilist1.begin(),ilist1.end(),inserter(ilist3,ilist3.begin()));

cout

<<"ilist1:"

::iterator iter=ilist1.begin();iter!=ilist1.end();iter++)

cout

<<"ilist2:"

::iterator i=ilist2.begin();i!=ilist2.end();i++)

cout

<<"ilist3:"

::iterator i=ilist3.begin();i!=ilist3.end();i++)

cout

0;}

輸出結果為

ilist1:

3 2 1 0

ilist2:

0 1 2 3

ilist3:

3 2 1 0 //為什麼不是0123呢,我們要記得,原文講了這麼多,其實我們中國人的思維方式就是inserter插入點不變!

如何理解inserter插入點不變呢?

我覺得這邊的意思是:

原文說是用insert實現,插入是指向的位置元素之前,但沒有說是返回的一定是新插入的迭代器,處理機制肯定經過了優化!

原文中說「插入位置就不再是容器的首元素了」,確實,因為它始終指向的是開始的那個指標,並一直保持到最後,並沒有指向容器首元素!

3.原文中的inserter的變是指絕對值的變化,我們理解的變是相對位置的變化!

接下來我們再來做乙個實驗,取自 博文中的例子,但原文中的例子有錯誤,我經過修改之後如下

#include

#include

#include

#include

using

namespace

std;

int main()

; vector

ivec(ia,ia+7);

list

ilst(7,0);

replace_copy(ivec.begin(),ivec.end(),inserter(ilst,ilst.begin()),100,0);

//replace_copy(ivec.begin(),ivec.end(),inserter(ilst,++ilst.begin()),100,0);

//replace_copy(ivec.begin(),ivec.end(),inserter(ilst,ilst.end()),100,0);

cout

<<"list: "

::iterator iter=ilst.begin();iter!=ilst.end();++iter)

cout

<<*iter<<" ";

cout

0; }

注:本段**中初始化了ilst為七個0的容器。

執行結果依次是

1  2  3  4  0  5  0  0  0  0  0  0  0  0

0 1 2 3 4 0 5 0 0 0 0 0 0 0

0 0 0 0 0 0 0 1 2 3 4 0 5 0

大家請看,插入位置的指標始終都沒變吧!

其中,對原文變與不變是站在角度不同理解所引起的。

C STL迭代器 插入迭代器

include stdafx.h include include include include include 演算法庫對所有在容器上的操作有個承諾 決不修改容器的大小 不插入 不刪除 有了插入迭代器,既使得演算法庫可以通過迭代器對容器插入新的元素,又不違反這一承諾,即保持了設計上的一致性。usi...

C 插入迭代器

插入迭代器std inserter std front inserter std back inserter均定義於標頭檔案.一 申明 std inserter要求容器支援insert操作。c表示容器,i表示將插入位置的迭代器。template class container std insert ...

STL 之插入迭代器

目錄 int list 5 vectorvlist copy list,list 5,vlist 當使用上述方式進行賦值時,由於vlist沒有分配空間,而出錯。解決方法使用遍歷陣列,並呼叫push back方法將元素儲存到vlist中。另外一種比較好的方式是通過插入迭代器完成。三種插入迭代器 bac...