有没有任何方法可以创建一个具有复合键和复合值的STL映射



我正在尝试创建一个映射,类似于:[{11,"Jitendra", 15.5}, {12, "Pranay", 15.5}],其中第一个花括号之间的数据变成,第二个花括号间的数据变成值。无论我尝试什么技巧,都会出错。

请告诉我如何声明STL映射、插入和操作值?

只要复合变量与operator<相当,它们就可以用作映射的键(请参见std::less(。最简单的情况是使用std::pair:

std::map<std::pair<int, std::string>, int> mymap; // key: int, string; value: int

您可以使用C++11中引入的std::tuple,用任意数量的关键元素来扩展这个概念。

对和元组都有自己的比较器重载(例如,请参见此处的元组(,因此,如果元组元素本身是可比较的,并且对优先于对/元组的第一个、第二个等元素的排序感到满意,则无需进一步的工作。使用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并为映射提供一个比较器来对其元素进行排序,从而进一步扩展它。如果你的编译器生活在月球后面,不支持C++11,你也可以这样做。