vector::insert和std::copy

荒凉一梦 提交于 2020-01-20 10:56:45

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的区别,上述即是一个不错的案例。

copy有一个需要注意的是OutputIt 必须满足遗留输出迭代器 (LegacyOutputIterator) 的要求。所以空的vector需要用back_inserter包装一下。OutputIt 必须满足遗留输出迭代器 (LegacyOutputIterator) 的要求
而insert没有这个要求,pos- 将内容插入到其前的迭代器。 pos 可为 end() 迭代器

例如:
对于copy,std::copy(src.begin(), src.end(), dst.begin())当dst是空的时候,dst.begin()或者dst.end()都会出问题,使用std::copy(src.begin(), src.end(), back_inserter(dst))问题解决。
对于insert,dst.insert(dst.begin(), src.begin(), src.end())在dst是空vector的时候也是没有问题的。

参考:

C++源码在线

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!