请问c++如何快速把一个vector里面的内容复制到另一个另一个vector的末尾?

fblgzdq 2009-09-28 04:33:44
请问如何快速把一个vector里面的内容复制到另一个另一个vector的末尾?

除了一个一个poush_back 过去还可以有什么别的好办法吗?



比如:

std::vector<int> v1;
std::vector<int> v2;

对于
v1.insert(v1.end(), v2.begin(), v2.end() );

std::copy(v2.begin(), v2.end(), std::back_inserter(v1));
速度有差别吗?
还有别的方法吗?

可不可以
a1=a1+a2 呢?
或者还有什么别的方便的语法呢?
希望举例说明。
谢谢大家
...全文
33203 27 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangc9999 2011-03-08
  • 打赏
  • 举报
回复
我一般不会怀疑标准库里的东西。
那些玩意可是高手中的高手写出来的……
xinjingbingmo 2011-02-23
  • 打赏
  • 举报
回复
我觉得那两个语句已经挺简单的了,vector本来效率就不是特别好,或者自己写一个
2009-09-30
  • 打赏
  • 举报
回复
是时候说两句了……

1、vector 的储存空间是连续的。
2、
template <class InputIterator>
void vector::insert(iterator position, InputIterator first, InputIterator last);

会自动分配空间,而且当 InputIterator 至少满足 forward iterator 的时候是一次分配,线性复杂度。

以上两点都是标准里白纸黑字写着的……
liveforlov 2009-09-30
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 wsllittlebird 的回复:]
如果楼主的程序规模不是很大的话,就尽量不要用vector,vector速度上一般,但是及其的耗费内存,这是因为当你用vector初始化一个数据的时候,可能就已经分配了2000倍的内存.可以完全用数组代替.
但是如果工程大的话,用vector就是不错的选择,毕竟其操作方便,并且在性能上取得了最大的平衡
[/Quote]
如果知道数据量,其实可以先考虑v.resize(XX)一下,再去存储数据,这样效率能好很多,内存也不会浪费
taodm 2009-09-30
  • 打赏
  • 举报
回复
楼主还是买本《stl源码剖析》多做研究吧。网上问人,10人可以有20种不同说法。
fblgzdq 2009-09-30
  • 打赏
  • 举报
回复
对于
v1.insert(v1.end(), v2.begin(), v2.end() );

std::copy(v2.begin(), v2.end(), std::back_inserter(v1));


为何有人说, 下面的比上面的快?

我用第一个地时候,没有提前扩大原vector的size 依然没有报错。 应该不用提前扩大 原vector的size吧?
  • 打赏
  • 举报
回复
v1.insert(v1.end(), v2.begin(), v2.end()); 都已经足够好了。
illuminati 2009-09-29
  • 打赏
  • 举报
回复
如果楼主的程序规模不是很大的话,就尽量不要用vector,vector速度上一般,但是及其的耗费内存,这是因为当你用vector初始化一个数据的时候,可能就已经分配了2000倍的内存.可以完全用数组代替.
但是如果工程大的话,用vector就是不错的选择,毕竟其操作方便,并且在性能上取得了最大的平衡
macrojj 2009-09-29
  • 打赏
  • 举报
回复
vector<vector<int>>
macrojj 2009-09-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 findcsdn 的回复:]
Vector 是一个容器,封装了内部的细节,不管用什么方法,效率都不会特别的高。

最好不要以为他们一定是内存连续的,还是乖乖的一个一个移吧!

想效率高就不要用这类臃肿的组件。



[/Quote]
看源码你就知道啊,肯定是连续存储的。
likexx 2009-09-29
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 loaden 的回复:]
引用 4 楼 fblgzdq 的回复:
引用 2 楼 loaden 的回复:
memcpy
  因为vector的内存是连续的!
  先给目标vector指定足够大的内存。


没有回答到问题呀?

你试过了吗?
C/C++ codev1.reserve(v1.size()+ v2.size());
memcpy(&v1[v1.size()-1], ...
[/Quote]

这段代码会出错吧(运行时出错)。reserve并不改变vector.size(),需要用vector.resize()才行。比如下面代码:

vector<int> buffer;
buffer.reserve(5);
buffer[3] = 1;


就会有runtime exception. 其本质是vector的assignment operator会检查当前vector size,因为reserve不改变size,所以直接赋值会出错,这个thread有非常详细的讨论:

http://www.codeguru.com/forum/showthread.php?t=340284


cphj 2009-09-28
  • 打赏
  • 举报
回复
虽然标准库效率不是最高的,但它的效率是最适当
过高的效率会损害代码的其他特性
「已注销」 2009-09-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fblgzdq 的回复:]
引用 2 楼 loaden 的回复:
memcpy
因为vector的内存是连续的!
先给目标vector指定足够大的内存。


没有回答到问题呀?
[/Quote]
你试过了吗?
v1.reserve(v1.size() + v2.size());
memcpy(&v1[v1.size()-1], ...
鸵鸟 2009-09-28
  • 打赏
  • 举报
回复
说错了, 应该是
std::copy(range2, back_inserter(range1)) 应该可以把
鸵鸟 2009-09-28
  • 打赏
  • 举报
回复
std::merge(range1,range2, back_inserter(range1)) 应该可以把
wssbygone 2009-09-28
  • 打赏
  • 举报
回复
v1.insert(v1.end(), v2.begin(), v2.end()); 执行这个不是要事先知道v1有足够剩余空间吗?
先用size()和capacity()看看存储的元素和容量有多大,如果剩余的空间不够的话,就reverse()分配一些空间,这些超出size()后面的空间是未初始化的,这个时候再执行v1.insert(v1.end(), v2.begin(), v2.end()); 应该就没问题了。。。
yangyunzhao 2009-09-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 findcsdn 的回复:]
Vector 是一个容器,封装了内部的细节,不管用什么方法,效率都不会特别的高。

最好不要以为他们一定是内存连续的,还是乖乖的一个一个移吧!

想效率高就不要用这类臃肿的组件。



[/Quote]
同意你前面两句,但是不同意你最后一句。
标准库的东西,效率不算最高。但是平均而言,我敢断言你写的代码不可能有标准库效率高。

就某一处特定位置,标准库的东西可能没有自己写的好。但是就整个工程而言,绝对是用标准库比自己写效率高N倍。

再说了,用标准库,只要你别用错,基本可以不担心内存问题。你自己写呢?
a043028448 2009-09-28
  • 打赏
  • 举报
回复
围观。。。
2009-09-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 mstlq 的回复:]
vector的数据是绝对要内存连续的,这是标准的规定……

关于楼主的问题,insert比copy效率高,因为insert可以事先知道所需内存多少,避免多次分配内存……
[/Quote]
~~顶一个~~
小马哥 2009-09-28
  • 打赏
  • 举报
回复
内存是否连续应给出测试方法和结果。
加载更多回复(7)

65,196

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧