c++ - 有没有办法用复合键和复合值创建一个 STL 映射?
问题描述
我正在尝试创建一个映射,例如:[{11,"Jitendra", 15.5}, {12, "Pranay", 15.5}]
,其中第一个大括号之间的数据成为键,第二个大括号之间的数据成为values。无论我尝试什么技术都会导致错误。
请让我知道如何声明 STL 映射、插入和操作值?
解决方案
复合变量可用作映射的键,只要它们可与operator<
(参见std::less)。最简单的情况是使用std::pair
:
std::map<std::pair<int, std::string>, int> mymap; // key: int, string; value: int
std::tuple
您可以使用C++11 中引入的任意数量的关键元素来扩展该概念。
对和元组都有自己的比较器重载(请参见此处的元组),因此如果您的元组元素本身可比较并且对优先于第一个的排序感到满意,那么您不需要做进一步的工作,然后第二个,依此类推,对/元组的元素。使用std::make_pair()
或std::make_tuple()
方便地创建它们。但是,它也可以这样工作(C++17):
std::map<std::tuple<int, int>, std::tuple<int, int>> foo;
// insert
foo[{1,2}] = {3,4};
// access
auto [v1, v2] = foo[{1,2}];
std::cout << v1 << ", " << v2 << std::endl;
struct
为了更加灵活,您可以通过使用 a并为地图提供一个比较器来对其元素进行排序,从而进一步扩展它。如果您的编译器位于月球后面并且不支持 C++11,您也可以这样做。
推荐阅读
- goland - Goland 无法将字符串类型的表达式转换为 []byte 类型
- javascript - 如何在谷歌图表中使用javascript全局变量
- java - Android java Listview滚动自动慢了
- r - 将可变长度列表转换为R中的矩阵
- java - 物理内存为 16 GB RAM 和 8 CPU 的 Linux 上 JDK8 64 位的 JVM 堆大小 (Xms Xmx) 应该是多少
- json - 将 json 转换为数据集时如何在 json 中包含该位
- javascript - 通过AJAX页面插入刷新
- android - Tesseract(OCR) - 错误的路径在某些设备中找不到经过训练的文件
- swift - 在 Realm Swift 中按日期获取组件
- angular - 在 redux 中状态更改后,Observable 没有更新