unique_ptr 到 nullptr 是不可复制的
unique_ptr to nullptr is uncopyable
创建 unique_ptr 的嵌套向量似乎会抛出 试图引用已删除的函数 。我相信这是因为它试图复制向量 unique_ptr(nullptr),而 unique_ptr(nullptr) 是不可复制的。
#include <memory>
#include <vector>
struct Foo {
};
int main() {
std::vector<std::vector<std::unique_ptr<Foo>>> foo(5, std::vector<std::unique_ptr<Foo>>(5));
}
https://onlinegdb.com/SkvGkVYoQ
我不确定如何进行。我只需要一个 nullptr 的多维数组,如果它们是唯一的,它会膨胀 - shared_ptr 除了解决这个问题外不需要。
std::unique_ptr
根本不可复制。这与 nullptr
无关。最简单的解决方法是只使用一维数组并映射维度。
然后你可以这样做:
for (std::size_t j = 0; i < 5; ++j) {
for (std::size_t i = 0; i < 5; ++i) {
std::size_t index = j*5+i;
foo.emplace_back(std::make_unique<Foo>());
}
}
(您可以对嵌套 std::vector
应用类似的模式,但这种方式在缓存位置等方面可能更好)
如果由于向量中每个嵌套向量元素的大小不同而需要嵌套多个向量,则可以使用 std::move
将唯一指针从一个向量移动到另一个向量。
std::vector<std::unique_ptr<Foo>> container1;
std::vector<std::unique_ptr<Foo>> container2;
for (int i = 0; i < 10; ++i)
{
container1.emplace_back(std::make_unique<Foo>());
}
for (int i = 0; i < 2; ++i)
{
container2.emplace_back(std::make_unique<Foo>());
}
std::vector<std::vector<std::unique_ptr<Foo>>> containers;
containers.emplace_back(std::move(container1));
containers.emplace_back(std::move(container2));
return 0;
虽然映射是最快的解决方案。
创建 unique_ptr 的嵌套向量似乎会抛出 试图引用已删除的函数 。我相信这是因为它试图复制向量 unique_ptr(nullptr),而 unique_ptr(nullptr) 是不可复制的。
#include <memory>
#include <vector>
struct Foo {
};
int main() {
std::vector<std::vector<std::unique_ptr<Foo>>> foo(5, std::vector<std::unique_ptr<Foo>>(5));
}
https://onlinegdb.com/SkvGkVYoQ
我不确定如何进行。我只需要一个 nullptr 的多维数组,如果它们是唯一的,它会膨胀 - shared_ptr 除了解决这个问题外不需要。
std::unique_ptr
根本不可复制。这与 nullptr
无关。最简单的解决方法是只使用一维数组并映射维度。
然后你可以这样做:
for (std::size_t j = 0; i < 5; ++j) {
for (std::size_t i = 0; i < 5; ++i) {
std::size_t index = j*5+i;
foo.emplace_back(std::make_unique<Foo>());
}
}
(您可以对嵌套 std::vector
应用类似的模式,但这种方式在缓存位置等方面可能更好)
如果由于向量中每个嵌套向量元素的大小不同而需要嵌套多个向量,则可以使用 std::move
将唯一指针从一个向量移动到另一个向量。
std::vector<std::unique_ptr<Foo>> container1;
std::vector<std::unique_ptr<Foo>> container2;
for (int i = 0; i < 10; ++i)
{
container1.emplace_back(std::make_unique<Foo>());
}
for (int i = 0; i < 2; ++i)
{
container2.emplace_back(std::make_unique<Foo>());
}
std::vector<std::vector<std::unique_ptr<Foo>>> containers;
containers.emplace_back(std::move(container1));
containers.emplace_back(std::move(container2));
return 0;
虽然映射是最快的解决方案。