C++ C++;: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

根据cppreference,variant不允许分配动态内存。这表明变量不应该像向量和映射那样动态分配容器作为模板。然而,有人说,有一个向量作为变体模板是可能的。变量是否存储向量指针或引用,而不是实际结构本身

我想有一个变量存储一个向量和一个地图。我想到了两种可能性:

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(是向量)
{
新(存储)标准::向量(值);
}
//等
}

a
variant
不分配动态内存。它包含的
std::vector
,谢谢大家的澄清。我真的误解了std::variant的文档,哈哈,这很有意义。