c++向量有效地添加元素

C++ vector adding elements efficiently

本文关键字:元素 添加 有效地 向量 c++      更新时间:2023-10-16

假设我有以下代码:

#include <iostream>
#include <vector>
using namespace std;
class X {
public:
  int x[1000];
  X(int y) { for (int i = 0; i < 1000; i++) x[i] = y; }
};
int main() {
  vector<X> v;
  X x0(0);
  X x1(1);
  X x2(2);
  v.push_back(x0);
  v.push_back(x1);
  v.push_back(x2);
  cout << v[2].x[33] << endl;
  return 0;
}

如果我理解正确,在我的代码中,我在堆栈上为x0, x1x2分配内存,然后将这些内容复制到由vector分配给我的内存中。此外,据我所知,移动语义在这里没有帮助,因为它不完全像X持有指向位于其他地方的资源的指针。

我是否可以直接调用vector分配给我的原始内存块上的构造函数?如果没有,处理这种情况的正确方法是什么?

您需要使用c++ 11的emplace_back .

http://en.cppreference.com/w/cpp/container/vector/emplace_back

同样,如果你担心多余的拷贝/移动,尝试从v.reserve(3)开始。

如果可用,也可以使用std::refboost::ref,并在vector中存储对象的引用,从而避免复制。

#include <iostream>
#include <vector>
#include <functional>
using namespace std;
class X {
public:
  int x[1000];
  X(int y) { for (int i = 0; i < 1000; i++) x[i] = y; }
};
int main() {
  std::vector<std::reference_wrapper<X> > v;
  X x0(0);
  X x1(1);
  X x2(2);

  v.push_back(std::ref(x0));
  v.push_back(std::ref(x1));
  v.push_back(std::ref(x2));
  cout << v[2].get().x[33] << endl;
  return 0;
}