C++ 哪种方法更快?背面插入器或调整大小

C++ 哪种方法更快?背面插入器或调整大小,c++,stl,C++,Stl,我想从uint类型的向量v1复制到uint类型的向量v2 V1大约有750000个元素 备选案文1: std::copy(v1.begin(), v1.end(), std::back_inserter(v2)); 或 备选案文2: v2.resize(v1.size()); std::copy(v1.begin(), v1.end(),v2.begin()); 哪种选择更快?我们不使用c++11 谢谢大家! 您可能太努力了。:-) 将正常工作,并根据需要调整大小/保留。您可能太努力了。:-

我想从uint类型的向量v1复制到uint类型的向量v2

V1大约有750000个元素

备选案文1:

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

备选案文2:

v2.resize(v1.size());
std::copy(v1.begin(), v1.end(),v2.begin());
哪种选择更快?我们不使用c++11


谢谢大家!

您可能太努力了。:-)


将正常工作,并根据需要调整大小/保留。

您可能太努力了。:-)



将工作正常,并根据需要调整大小/保留。

这是一个非常晚的答复,但几年前我做了一些实验和测量。它们可以在我的博客上找到。它还列出了一些其他的选项,结果可能会让其他人感兴趣。

这是一个非常晚的答复,但几年前我做了一些实验和测量。它们可以在我的博客上找到。它还列出了一些其他选项,其他人可能会对结果感兴趣。

如果在选项1中添加一个
v2.reserve(v1.size())
,我认为它们会非常接近。可靠的答案是:自己对其进行基准测试。v1是
float
类型还是uint类型?在前两段中,你不同意自己的观点。另一个竞争者是使用SSE,但可能编译器足够聪明,可以使用这些指令等等。唯一知道的方法是基准测试。这意味着对应用程序进行基准测试(并找出这是否是瓶颈),而不是简单的测试代码。@Yakk,V1是uint类型的。修复了它。如果你在选项1中添加一个
v2.reserve(v1.size())
,我认为它们会非常接近。一个可靠的答案是:自己进行基准测试。v1是
float
类型还是uint类型?在前两段中,你不同意自己的观点。另一个竞争者是使用SSE,但可能编译器足够聪明,可以使用这些指令等等。唯一知道的方法是基准测试。这意味着对应用程序进行基准测试(并找出这是否是瓶颈),而不是简单的测试代码。@Yakk,V1是uint类型的。修正了。如果我们不需要向量v1的内容,我们可以使用交换方法更快吗?v2.交换(v1)?因为交换是固定时间的:cplusplus.com/reference/vector/vector/swap@Hocine-否,向量包含整数和浮点,因此无法交换。必须复制这些值(并在复制过程中进行转换)。@BoPersson,vector::assign的复杂性是线性的,这正是我试图避免的。如果值类型是可忽略的,则复制会进行大容量传输。我不确定uint to double是否可以作为普通的可复制对象。@sgowd-您有两种不同的类型,因此在复制时必须转换它们<代码>标准::复制无法绕过它。@sgowd您正在对n个元素进行操作。这本质上是线性的。即使是批量拷贝也仍然是线性的。不,memmov或memcpy不会用于uint翻倍。如果不需要向量v1的内容,我们可以使用交换方法更快吗?v2.交换(v1)?因为交换是固定时间的:cplusplus.com/reference/vector/vector/swap@Hocine-否,向量包含整数和浮点,因此无法交换。必须复制这些值(并在复制过程中进行转换)。@BoPersson,vector::assign的复杂性是线性的,这正是我试图避免的。如果值类型是可忽略的,则复制会进行大容量传输。我不确定uint to double是否可以作为普通的可复制对象。@sgowd-您有两种不同的类型,因此在复制时必须转换它们<代码>标准::复制无法绕过它。@sgowd您正在对n个元素进行操作。这本质上是线性的。即使是批量拷贝也仍然是线性的。不,memmov或memcpy不会用于uint翻倍。
v2.assign(v1.begin(), v1.end());