用更大的向量覆盖向量的最有效方法

Most efficient way to overwrite a vector with a larger one

本文关键字:向量 有效 方法 覆盖      更新时间:2023-10-16

我有一个std::vector,我想用新元素覆盖,这也会使它更大。 执行此操作的最快/最节省内存的方法是什么? 这是我幼稚的实现:

#include <vector>
int main() {
  std::vector<int> smallVec(10, 1);
  int bigVecSize = 100;
  smallVec.clear();         
  for(int i = 0; i < bigVecSize; ++i)
    smallVec.push_back(i);
}

是否有任何 C++11 功能可能会有所帮助? 谢谢。

抱歉,我对 C++11 没有任何想法。

但是,我认为按::memcpy复制内存更快.

#include <vector>
void overwrite(std::vector<int>& dst, const std::vector<int>& src)
{
    /* some code - to check the valid of dst and src */
    dst.resize(src.size());
    ::memcpy(dst.data(), src.data(), sizeof(int) * src.size());
}
int main(int argc, char* argv[])
{
    // an example
    std::vector<int> via, vib;
    via.push_back(22);
    via.resize(5, 1);
    vib.push_back(123);
    vib.resize(10, 2);
    vib.push_back(123);
    overwrite(via, vib);
    return 0;
}

std::vector的数据存储器总是随之而来的,因此您可以将存储器从一个std::vector复制到另一个。

注意:std::vector的项目类型是包含/一些指针的对象时,您需要小心。因为::memcpy只是将地址复制到另一个地址,所以不要复制指针的对象。

smallVec.reserve(bigVecSize); 可以为新元素保留足够的空间。

试试这个代码:

#include <vector>
#include <stdio.h> //for printf()
#include <stdlib.h> //for system()
#include <time.h> //for time() & time_t
int main() {
  std::vector<int> smallVec(10, 1);
  int bigVecSize = 1000000;
  smallVec.reserve(bigVecSize);
  smallVec.clear();
  time_t ts,te;
  ts=time(NULL);
  for(int i = 0; i < bigVecSize; ++i)
    smallVec.push_back(i);
  te=time(NULL);
  printf("%ldn",te-ts);
}

使用预留 将时间成本从 0.125s 降低到 0.087s

在C++11中,如果用户定义元素用作向量的元素,则可以使用R值引用来减少复制。