首页 > 解决方案 > 有没有办法用复合键和复合值创建一个 STL 映射?

问题描述

我正在尝试创建一个映射,例如:[{11,"Jitendra", 15.5}, {12, "Pranay", 15.5}],其中第一个大括号之间的数据成为,第二个大括号之间的数据成为values。无论我尝试什么技术都会导致错误。

请让我知道如何声明 STL 映射、插入和操作值?

标签: c++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,您也可以这样做。


推荐阅读