use*_*261 5 c++ vector unique-ptr
如何在一行中正确调整 unique_ptr 向量的大小,而 gcc 不会给出有关已删除函数的编译错误?
vector<vector<unique_ptr<A> >> a;
a.resize(..... )
Run Code Online (Sandbox Code Playgroud)
更新:这是我使用的代码,可以正常工作。
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());
Run Code Online (Sandbox Code Playgroud)
如果可能,我想一次性调整大小,就像调整向量的向量一样;
vector<vector<int>> intObj;
intObj.resize(width, vector<int>(height, int()));
Run Code Online (Sandbox Code Playgroud)
但是每当我尝试使用以下方法调整上述向量的大小时,都会出现此错误;
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>]’
Run Code Online (Sandbox Code Playgroud)
谢谢。
问题是它vector<unique_ptr<A>>是不可复制的类型,因为
unique_ptr<A>无法复制。使用anda.resize(x, vector<unique_ptr<A>>(y))的复制构造函数更糟糕,因为它同时使用and的复制构造函数。vector<unique_ptr<A>>a.resize(x, vector<unique_ptr<A>>(y, unique_ptr<A>()))unique_ptr<A>vector<unique_ptr<A>>
两种解决方案:
vector<unique_ptr<A>>使用尺寸为 的单张x*y。这意味着
a.resize(x*y)将按预期工作。循环示例:
a.resize(x);
for (auto& i : a) {
i.resize(y);
}
Run Code Online (Sandbox Code Playgroud)
编辑:如果您希望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>());
}
}
Run Code Online (Sandbox Code Playgroud)
如果您保持当前的设计,则无法使用单个resize调用来完成您想要的操作。
As编辑 2:如果您采用解决方案 1,这里有一个用于默认构造的单行:
std::generate_n(std::back_inserter(a), x*y, []{ return std::make_unique<A>(); });
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4047 次 |
| 最近记录: |