insert可以用於vector的拼接,將一個元素或vector插入到當前vector中。
比如:
//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的時候也是沒有問題的。
參考: