2014-09-11 78 views
1

我有一定的大小的std::vector,并且需要分配(尺寸34)另一矢量的内容是到位置34 ... 67.原始矢量的大小不应该改变。综观矢量的API我需要更换一个范围内的元素在载体

  • assign()不起作用,因为它取代所有元素。

  • swap()不起作用,因为它取代所有元素。

  • emplace()不起作用,因为它创造了一个新的元素。

  • reserve(),然后循环at()会工作,但它会很好,以避免循环。 memcpy(target.data [34],source.data(),34 * sizeof(T))将在没有循环的情况下工作,但看起来像C hack。

  • std::copy会很好地工作,但隐藏循环我希望它比memcpy()慢。

元素是整数。当改变矢量中的一系列元素时,哪个应该是默认方法?

+4

'std :: copy'是正确的方法。我敢打赌,无论您需要什么,它都可以非常快速地完成。 :) – 2014-09-11 10:29:39

+0

'std :: copy'确实是正确的方法。对于类似POD类型的容器和*尤其是对于像你的积分这样的本地标量的容器,如果它专门用于基本的'memcpy'内在的话,我不会感到震惊。 *尝试一下*。 – WhozCraig 2014-09-11 10:32:25

+0

出于好奇,你为什么期望它很慢? – 2014-09-11 10:36:17

回答

5

std::copy是用于向量的有限范围替换值的很好的方法。

不要考虑memcpy可言,因为它是UB非POD项目。

算法等std::copy一般被优化,可能特例,对于二进制能够复制类型。也就是说,他们自动执行正确的事情™。如果您对性能有疑问,请致电MEASURE

+0

谢谢,现在我的良知很清楚。 – Vorac 2014-09-11 10:35:32

1

如果您的类型很简单,那么使用std::copy它可能被优化为memcopy

不然,如果您要插入的载体的插入它是复杂的,你可以尝试std::swap_ranges破坏后,节省了呼叫摧毁一动。

而且正如Alf已经指出的那样,措施是件好事。

+0

这不是我想消除的瓶颈。相反,我坚持代码质量。我不想用一种愚蠢的方式,在代码库中使用第400个代码之后,有人注意到由于某种原因性能下降。 – Vorac 2014-09-11 10:43:09

相关问题