C++ C++;:variant可以容纳向量、映射和其他容器吗?
根据cppreference,variant不允许分配动态内存。这表明变量不应该像向量和映射那样动态分配容器作为模板。然而,有人说,有一个向量作为变体模板是可能的。变量是否存储向量指针或引用,而不是实际结构本身 我想有一个变量存储一个向量和一个地图。我想到了两种可能性:C++ C++;:variant可以容纳向量、映射和其他容器吗?,c++,variant,C++,Variant,根据cppreference,variant不允许分配动态内存。这表明变量不应该像向量和映射那样动态分配容器作为模板。然而,有人说,有一个向量作为变体模板是可能的。变量是否存储向量指针或引用,而不是实际结构本身 我想有一个变量存储一个向量和一个地图。我想到了两种可能性: std::variant<std::vector<int>, std::map<int, int> > x; //stores within the variant itself ?? std
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.
std::变体x//存储在变体本身中??
std::变异体y//只存储一个指针。容器被分配到其他地方。
我更喜欢第一个选项,因为它简单。让我知道你的想法 std::vector
是一个带有指针的类,用于管理动态分配的内存
std::variant
如果不允许“分配内存”,则无法将std::vector
对象本身存储在动态内存中,但该向量可以管理自己的动态内存。您弄错了
变量
类本身不分配单个字节(否则它可能会有一个分配器模板参数)。课堂上的一切都是局部的。但是“变异”类型本身可以分配任意多的内存。它们拥有自己的内存,所有这些都与std::variant
无关。它一点也不像std::string的数组。当然,C数组本身不分配任何内容,但是单个元素(字符串)必须进行一些分配
根据cppreference,variant不允许分配动态内存
你误解了那是什么意思<不允许通过动态分配包含的对象来实现code>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
}
类不正确\u变量{
联合{
std::vector*vector;
标准::地图*地图;
}u;
枚举类{
是_vec,,
这是一张地图,
}k;
公众:
不正确的变量(std::vector value):u(新std::vector(value)),k(is_vec){
//等
}
类正确变量{
std::对齐存储;
枚举类{
是_vec,,
这是一张地图,
}k;
公众:
正确的变量(标准::向量值):k(是向量)
{
新(存储)标准::向量(值);
}
//等
}
avariant
不分配动态内存。它包含的std::vector
,谢谢大家的澄清。我真的误解了std::variant的文档,哈哈,这很有意义。