vector::insert和std::copy


insert可以用於vector的拼接,將一個元素或vector插入到當前vector中。

insert官方函數解釋

比如:

//denoisedImage.size() == 2
//cmpCount = 1;
//std::vector<cv::Mat> tmpDnImg;
//tmpDnImg.clear();
tmpDnImg.insert(tmpDnImg.begin(), denoisedImage.begin() + 1, denoisedImage.end());

上述示例將denoisedImage的一部分插入到tmpDnImg的最前端。也可以使用std::copy來實現相同效果:std::copy(denoisedImage.begin() + 1, denoisedImage.end(), std::back_inserter(tmpDnImg));
其中,有一個點要注意,insert對於基礎類型,自然就是深拷貝,直接將待插入數據一個一個地插入到相應位置;但是對於 類class等, 其可能(因為還沒有看通STL的源碼,故還不是很確定)只是拷貝了對象的頭指針。因此在之后的操作中,denoisedImage發生了變化時(比如,覆蓋denoisedImage下標為0,1,2位置的數據),對應的tmpDnImg也會發生變化。

關於vector::insert和std::copy的區別,上述即是一個不錯的案例。

具體歸納一下
std::copy有一個需要注意的是OutputIt 必須滿足遺留輸出迭代器 (LegacyOutputIterator) 的要求。所以空的vector需要用back_inserter包裝一下。OutputIt 必須滿足遺留輸出迭代器 (LegacyOutputIterator) 的要求
而vector::insert沒有這個要求,pos- 將內容插入到其前的迭代器。 pos 可為 end() 迭代器

例如:
對於std::copy,std::copy(src.begin(), src.end(), dst.begin())當dst是空的時候,dst.begin()或者dst.end()都會出問題,使用std::copy(src.begin(), src.end(), back_inserter(dst))問題解決。
對於vector::insert,dst.insert(dst.begin(), src.begin(), src.end())在dst是空vector的時候也是沒有問題的。

參考:

C++源碼在線


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM