有什么方法可以创建带有复合键和复合值的STL映射?

时间:2020-07-16 14:00:02

标签: c++ stl

我正在尝试创建一个地图,例如:[{11,"Jitendra", 15.5}, {12, "Pranay", 15.5}],其中第一个大括号之间的数据变为 key ,而第二个大括号之间的数据变为 values 。我尝试使用的任何技术都会导致错误。

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

1 个答案:

答案 0 :(得分:1)

复合变量可用作映射的键​​,只要它们与operator<(请参阅std::less)具有可比性即可。最简单的情况是使用std::pair

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

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

成对和元组都带来自己的比较器重载(请参见例如元组here),因此,如果您的元组元素本身是可比较的,并且对可以使对/元组的第一个元素上的优先级,然后是第二个元素,依此类推。使用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,您也可以这样做。