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++源码在线

posted @ 2020-01-20 10:24  Lo3King  阅读(2091)  评论(0编辑  收藏  举报