gpt4 book ai didi

c++ - 如何调整 unique_ptr vector 的 vector 大小?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:08:47 26 4
gpt4 key购买 nike

如何在一行中正确调整 unique_ptr vector 的大小而不 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 的大小一样;

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

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

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>]’

谢谢。

最佳答案

问题是 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. 或者,您需要对所有子 vector 使用循环。

循环示例:

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

编辑:如果你想要 unique_ptr<A> s指向默认构造A s 而不是 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:这是默认构造的单行代码 As如果您采用解决方案 1:

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

关于c++ - 如何调整 unique_ptr vector 的 vector 大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33953115/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com