三種型別:
* 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...