std :: unordered_multimap中元素的顺序

时间:2013-01-15 20:32:59

标签: c++ stl multimap

如果我有以下代码

std::unordered_multimap<std::string, std::vector<double>> myMap;
std::vector<double> v1, v2, v3;
// init v1, v2, v3....
myMap.insert(std::make_pair<std::string, std::vector<double>("vec", v1));
myMap.insert(std::make_pair<std::string, std::vector<double>("vec", v2));
myMap.insert(std::make_pair<std::string, std::vector<double>("vec", v3));

如果我使用迭代器访问值,它们将始终按以下顺序排列:v1, v2, v3

所以基本上如果我插入相同键但不同值的元素,它们始终是否保留插入顺序?

3 个答案:

答案 0 :(得分:6)

我想这是特定于实现的。如果实现是桶哈希映射,则具有相同密钥的unordered_multimap元素存储在同一个桶中,在这种情况下,它们可以采用相同的插入顺序(可能是您的情况)。

但是在实施的unordered_map中,例如,使用开放寻址技术,订单可能会发生变化。我不知道是否有STL实现使用不同的引擎实现,但类的合同没有对相同键的值的顺序做任何假设,所以我不认为你可以采取它理所当然的。

取自here

  

在内部,unordered_map中的元素没有按照其键值或映射值的任何特定顺序排序

答案 1 :(得分:3)

名称中“无序”的全部意义在于您不能依赖订单。如初。

如果您检测到来自迭代容器的任何订单,则这是实现的巧合或工件。你应该从不指望它。

答案 2 :(得分:2)

除非文档说明他们将始终以插入顺序返回,否则你会依赖它做错事。您今天使用的STL实现可能会发生变化。如果地图中有很多条目,那么您正在使用的实现可能会以不同的方式工作。