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

原文链接: https://www.cnblogs.com/liuxin0430/p/12093256.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    vector::insert和std::copy

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/192149

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 下午5:57
下一篇 2023年2月12日 下午5:57

相关推荐