C++ STL std::copy 詳解
(223條消息) C++ STL std::copy 詳解_a_ran的博客-CSDN博客_c++ std::copy
如果要把一個序列(sequence)拷貝到一個容器(container)中去,通常用std::copy算法,代碼如下:
std::copy(start, end, std::back_inserter(container));
這里,start和end是輸入序列(假設(shè)有N個元素)的迭代器(iterator),container是一個容器,該容器的接口包含函數(shù)push_back。假設(shè)container開始是空的,那么copy完畢后它就包含N個元素,并且順序與原來隊列中的元素順序一樣。標(biāo)準(zhǔn)庫提供的back_inserter模板函數(shù)很方便,因?yàn)樗鼮閏ontainer返回一個back_insert_iterator迭代器,這樣,復(fù)制的元素都被追加到container的末尾了。
現(xiàn)在假設(shè)container開始非空(例如:container必須在循環(huán)中反復(fù)被使用好幾次)。那么,要達(dá)到原來的目標(biāo),必須先調(diào)用clear函數(shù)然后才能插入新序列。這會導(dǎo)致舊的元素對象被析構(gòu),新添加進(jìn)來的被構(gòu)造。不僅如此,container自身使用的動態(tài)內(nèi)存也會被釋放然后又創(chuàng)建,就像list,map,set的節(jié)點(diǎn)。某些vector的實(shí)現(xiàn)在調(diào)用clear的時候甚至?xí)尫潘袃?nèi)存。
通常,考慮到在一個已有的元素上直接copy覆蓋更高效。刻意這樣做:
std::copy(start, end, container.begin());
在這里你在container的頭部執(zhí)行了copy-over(覆蓋賦值)操作,但是,如果container的大小小于輸入序列的長度N的話,這段代碼會導(dǎo)致崩潰(crash)。
-
eg1:
-
int a[3] = {1, 2, 3};
-
int b[3];
-
std::copy(a, a+3, b);
-
for(int j=0; j<3; j++)
-
cout<< b[j] << endl;
-
-
eg2:
-
vector temp(3);
-
int a[3] = {1, 2, 3};
-
std::copy(a, a+3, &temp.front());
-
for(int j=0; j<3; j++)
-
cout<< temp[j] << endl;
copy只負(fù)責(zé)復(fù)制,不負(fù)責(zé)申請空間,所以復(fù)制前必須有足夠的空間

浙公網(wǎng)安備 33010602011771號