gpt4 book ai didi

C++:std::variant 可以容纳 vector 、 map 和其他容器吗?

转载 作者:行者123 更新时间:2023-12-04 14:57:44 26 4
gpt4 key购买 nike

根据cppreference,variant是不允许分配动态内存的。这表明变体不应将动态分配的容器作为模板,如 vector 和 map 。然而,有人说可以将 vector 作为变体模板。会不会是变体存储了 vector 指针或引用,而不是实际结构本身?

我想要一个存储 vector 和 map 的变体。我想到了两种可能性:

std::variant<std::vector<int>, std::map<int, int> > x; //stores within the variant itself ??
std::variant <std::uniqur_ptr<std::vector<int> >, std::unique_ptr<std::map<int, int> > > y; //stores only a pointer. The container is allocated elsewhere.

我更喜欢第一个选项,因为它很简单。让我知道你的想法!

最佳答案

According to cppreference, variant is not allowed to allocate dynamic memory.

你误解了那是什么意思。 std::variant 不允许通过动态分配包含的对象来实现,但允许包含的对象执行它通常执行的任何操作。

两者的区别

class incorrect_variant {
union {
std::vector<int> * vector;
std::map<int, int> * map;
} u;
enum kind {
is_vec,
is_map,
} k;
public:
incorrect_variant(std::vector<int> value) : u(new std::vector<int>(value)), k(is_vec) {}

// etc
}

class correct_variant {
std::aligned_storage<std::max(sizeof(std::vector<int>), sizeof(std::map<int, int>)> storage;
enum kind {
is_vec,
is_map,
} k;
public:
correct_variant(std::vector<int> value) : k(is_vec)
{
new (storage) std::vector<int>(value);
}

// etc
}

关于C++:std::variant 可以容纳 vector 、 map 和其他容器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67623574/

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