vector::insert和std::copy
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的时候也是没有问题的。
参考: