生活随笔
收集整理的這篇文章主要介紹了
stl 之 copy copy_backward
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
http://blog.csdn.net/jerryjbiao/article/details/7381498
元素復(fù)制算法copy
該算法主要用于容器之間元素的拷貝,即將迭代器區(qū)間[first,last)的元素復(fù)制到由復(fù)制目標(biāo)result給定的區(qū)間[result,result+(last-first))中。下面我們來看看它的函數(shù)原型:
函數(shù)原形:
[cpp]?view plaincopy
template<class?InputIterator,?class?OutputIterator>?? ???OutputIterator?copy(?? ??????InputIterator?_First,??? ??????InputIterator?_Last,??? ??????OutputIterator?_DestBeg?? ???);??
參數(shù)
_First,?_Last
指出被復(fù)制的元素的區(qū)間范圍[ _First,_Last)._DestBeg?
指出復(fù)制到的目標(biāo)區(qū)間起始位置
返回值
返回一個(gè)迭代器,指出已被復(fù)制元素區(qū)間的最后一個(gè)位置
程序示例:
首先我們來一個(gè)簡(jiǎn)單的示例,定義一個(gè)簡(jiǎn)單的整形數(shù)組myints,將其所有元素復(fù)制到容器myvector中,并將數(shù)組向左移動(dòng)一位。
[cpp]?view plaincopy
? ? ? ? ? ? ? ? ? ? ? ? ?? ?? #include?<iostream>?? #include?<algorithm>?? #include?<vector>?? ?? using?namespace?std;?? ?? int?main?()??? {?? ????int?myints[]?=?{10,?20,?30,?40,?50,?60,?70};?? ????vector<int>?myvector;?? ????vector<int>::iterator?it;?? ?????? ????myvector.resize(7);????? ?????? ?????? ?????? ????copy?(?myints,?myints+7,?myvector.begin()?);?? ?????? ????cout?<<?"myvector?contains:?";?? ????for?(?it?=?myvector.begin();??it?!=?myvector.end();??++it?)?? ????{?? ????????cout?<<?"?"?<<?*it;?? ????}?? ????cout?<<?endl;?? ?? ?????? ?????? ????copy(myints?+?1,?myints?+?7,?myints);?? ?? ????cout?<<?"myints?contains:?";?? ????for?(?size_t?i?=?0;?i?<?7;?++i?)?? ????{?? ????????cout?<<?"?"?<<?myints[i];?? ????}?? ????cout?<<?endl;?? ?? ????return?0;?? }??
從上例中我們看出copy算法可以很簡(jiǎn)單地將一個(gè)容器里面的元素復(fù)制至另一個(gè)目標(biāo)容器中,上例中代碼特別要注意一點(diǎn)就是myvector.resize(7);這行代碼,在這里一定要先為vector分配空間,否則程序會(huì)崩,這是初學(xué)者經(jīng)常犯的一個(gè)錯(cuò)誤。其實(shí)copy函數(shù)最大的威力是結(jié)合標(biāo)準(zhǔn)輸入輸出迭代器的時(shí)候,我們通過下面這個(gè)示例就可以看出它的威力了。
[cpp]?view plaincopy
? ? ? ? ? ? ? ? ? ? ? ? ?? ?? #include?<iostream>?? #include?<algorithm>?? #include?<vector>?? #include?<iterator>?? #include?<string>?? ?? using?namespace?std;?? ?? int?main?()??? {?? ?????typedef?vector<int>?IntVector;?? ?????typedef?istream_iterator<int>?IstreamItr;?? ?????typedef?ostream_iterator<int>?OstreamItr;?? ?????typedef?back_insert_iterator<?IntVector?>?BackInsItr;?? ??? ?????IntVector?myvector;?? ?? ??????? ??????? ?????cout?<<?"Please?input?element:"?<<?endl;?? ?????copy(IstreamItr(cin),?IstreamItr(),?BackInsItr(myvector));?? ?? ??????? ?????cout?<<?"Output?:?"?<<?endl;?? ?????copy(myvector.begin(),?myvector.end(),?OstreamItr(cout,?"?"));??? ?????cout?<<?endl;?? ?? ????return?0;?? }??
copy_backward(first, last, result)
拷貝行為和copy類似,只是方向相反
對(duì)于區(qū)間[first, last) 內(nèi)每一個(gè)元素,以逆方向復(fù)制到以result - 1 為起點(diǎn),方向亦為逆行的區(qū)間。大體模擬就是
*(result - 1)= *(last - 1),?*(result - 2)= *(last - 2),?*(result - 3)= *(last - 3),..
返回的迭代器為result - (last-first)
當(dāng)源區(qū)間和目標(biāo)區(qū)間不重疊時(shí),或者是兩個(gè)不同的 緩沖區(qū),copy 和copy_backward最終的效果是類似的。
但是,如果區(qū)間有重疊,問題就出現(xiàn)了:
copy允許尾部和輸入?yún)^(qū)間重疊,
copy_backward允許頭部和輸入?yún)^(qū)間重疊
當(dāng)不滿足上述條件的重疊時(shí),這兩個(gè)函數(shù)不保證正確。
總結(jié)
以上是生活随笔為你收集整理的stl 之 copy copy_backward的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。