当前位置: 首页 > 知识库问答 >
问题:

在C++字典中存储多个类型作为值?

东门清夷
2023-03-14

我想写一个行为几乎等同于Python字典的C++对象。C++的std::mapstd::unordered_map提供了Python词典已经具备的一些功能,但缺少一个最重要的功能,即能够添加任意对象和类型。即使这是不可能的,您能在多大程度上实现Python字典的功能?

前面的几个问题(这里和这里)未能处理向字典中添加多个类型的问题。

my_dict = {'first': 1,
           'second': "string",
           'third': 3.5,
           'fourth': my_object}
my_dict['fifth'] = list([1, 2, 3])

我认为最好的解决方案是使用void指针对数据进行重新解释,或者使用某种带有类型限制的运行时多态性?

共有1个答案

袁运良
2023-03-14

我认为最好的解决方案是使用void指针对数据进行重新解释,或者使用某种带有类型限制的运行时多态性?

在我看来,现代C++中的许多无效指针和许多对指针的重新解释应该是一个糟糕设计的信号。我相信多态性将是一种可行的方法。

此外,如果要使用固定数量的类型,请考虑使用C++17的std::any或std::variant,这是一种更现代的union

#include <iostream>
#include <map>
#include <string>
#include <variant>

typedef std::map<std::variant<int, std::string>, std::variant<int, std::string>> Dict;

int main(){
    Dict d;
    d["key"] = 1;
    d[5] = "woah";
    std::cout << std::get<int>(d["key"]) << std::endl; // prints 1

    // edit: print all the keys in d
    for(auto& k_v: d){
        std::visit(
            [](auto& value){std::cout << value << ' ';},
            k_v.first // k_v.second to print all values in d
        );
    }

}

编辑:我添加了一个std::visit的示例,它在字典中迭代键。

 类似资料:
  • 问题内容: 我想在[String:SomeClass]类型的Dictionary中存储一个更专业的类型。这是一些说明我的问题的示例代码(也可以在https://swiftlang.ng.bluemix.net/#/repl/579756cf9966ba6275fc794a上使用): 它产生错误。 我已经尝试过强制转换,但是会产生错误。 我也尝试将Dictionary定义为type,但这也没有任何改

  • 每个类都有一些独特的字段。所有最大的功能是:添加,更新,删除,查找,显示列表,保存,加载文件 -所以,首先我将创建一个名为Product的类,它有4个公共字段。以上课程将从产品延伸。 -然后,我想我可能会创建一个ComputerStore类,它有一个字段是items类型ArrayList。items存储所有的对象,这些对象是上述4个类的实例,但我不确定。

  • 问题内容: 我需要在Django模型中存储一些数据。这些数据并不等于模型的所有实例。 最初,我考虑过将模型子类化,但是我试图保持应用程序的灵活性。如果使用子类,则每次需要新的对象时都需要创建一个整个类,这是不好的。我还将最终得到很多子类,仅用于存储一对额外的字段。 我真的觉得词典是最好的方法,但是Django文档中没有关于在Django模型中存储词典的内容(或者我找不到它)。 有什么线索吗? 问题

  • 问题内容: 我是python的新手,我列出了每年的年份和值。我想做的是检查字典中是否已经存在年份,如果存在,则将值附加到特定键的值列表中。 例如,我有一个年份列表,每年都有一个值: 我想做的是用年作为键填充那些字典,而那些数字作为值填充字典。但是,如果我两次列出了2009,那么我想将该第二个值追加到该词典中的值列表中,因此我想: 现在,我有以下内容: 问题答案: 如果我可以重新表述您的问题,您想要

  • 问题内容: 我习惯于使用.csv文件将数据导入和导出Python,但这存在明显的挑战。关于在json或pck文件中存储字典(或字典集)的简单方法有何建议?例如: 我想知道如何保存此内容,然后如何将其重新加载。 问题答案: 泡菜 保存: 有关该参数的其他信息,请参见pickle模块文档。 酸洗 负荷: JSON 保存: 提供额外的参数,例如或以获得漂亮的结果。参数 sort_keys 将按字母顺序对

  • 问题内容: 我是python的新手,我列出了每年的年份和值。我想做的就是检查字典中是否已经存在年份,如果存在,则将值附加到特定键的值列表中。 举例来说,我有一个年份列表,每年都有一个值: 我想做的是用年作为键填充那些字典,而那些数字作为值填充字典。但是,如果我两次列出了2009,那么我想将该第二个值附加到该词典中的值列表中,因此我想: 现在,我有以下内容: 问题答案: 如果我可以重新表述你的问题,