c – 如何调整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>]’

谢谢.

最佳答案 问题是向量< unique_ptr< A>>是一种不可复制的类型,因为

的unique_ptr&LT a取代;无法复制. a.resize(x,vector< unique_ptr< A>>(y))使用向量< unique_ptr< A>>的复制构造函数.并且a.resize(x,vector< unique_ptr< A>>(y,unique_ptr< A>()))甚至更糟,因为它使用unique_ptr< A>的复制构造函数.和矢量< unique_ptr< A>>.

两种解决方案

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

循环示例:

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

编辑:如果您希望unique_ptr< A> s指向默认构造的As而不是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>());
    }
}

如果维护当前设计,则无法使用单个调整大小调用来执行所需操作.

编辑2:这是一个默认构建的一个班轮就像你使用解决方案1:

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