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

时间:2014-02-07 03:43:37

标签: c++ vector

我有一个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功能?感谢。

2 个答案:

答案 0 :(得分:3)

抱歉,我对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复制到另一个{。\ n}。

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

答案 1 :(得分:1)

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("%ld\n",te-ts);
}

使用reserve将时间成本从0.125s减少到0.087s

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