如何调整unique_ptr向量的向量?

时间:2015-11-27 08:27:42

标签: c++ vector unique-ptr

如何在一行中正确调整unique_ptr向量的向量,而没有gcc给出有关已删除函数的编译错误?

vector<vector<unique_ptr<A> >> a;
a.resize(..... )

更新: 这是我使用的代码可以正常工作。

  int width, height;
  vector<vector<unique_ptr<A> >> a;
  a.resize(width);
  for (int i = 0; i < width; i++) {
      for (int j = 0; j < height; j++) {
          a.at(i).emplace_back(new A());

如果可能的话,我想一次调整大小,就像调整矢量矢量大小一样;

vector<vector<int>> intObj;
intObj.resize(width, vector<int>(height, int()));

但每当我尝试使用以下方法调整上述向量时,我都会收到此错误;

a.resize(x, vector<unique_ptr<A>>(y, unique_ptr<A>()));

error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = A; _Dp = std::default_delete<A>]’

感谢。

2 个答案:

答案 0 :(得分:4)

问题是vector<unique_ptr<A>>是不可复制的类型,因为 无法复制unique_ptr<A>a.resize(x, vector<unique_ptr<A>>(y))使用vector<unique_ptr<A>>的复制构造函数,a.resize(x, vector<unique_ptr<A>>(y, unique_ptr<A>()))使用unique_ptr<A>vector<unique_ptr<A>>的复制构造函数更加糟糕。

两种解决方案:

  1. 使用大小为vector<unique_ptr<A>>的单个x*y。这意味着 a.resize(x*y)将按预期工作。
  2. 或者,您需要在所有子矢量上使用循环。
  3. 循环示例:

    a.resize(x);
    for (auto& i : a) {
        i.resize(y);
    }
    

    编辑:如果您希望unique_ptr<A>指向默认构造的A而不是nullptr,那么您可以使用此代码:

    a.resize(x);
    for (auto& i : a) {
        i.reserve(y);
        for (int j = 0; y != j; ++j) {
            i.push_back(std::make_unique<A>());
        }
    }
    

    如果维持当前的设计,则无法使用单个resize调用来执行您想要的操作。

    编辑2:如果你选择解决方案1,这是一个默认构建As的单行:

    std::generate_n(std::back_inserter(a), x*y, []{ return std::make_unique<A>(); });
    

答案 1 :(得分:-2)

std :: unique_ptr不可复制使用std :: shared_ptr来获得完整的容器支持。