如果我有以下代码
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
所以基本上如果我插入相同键但不同值的元素,它们始终是否保留插入顺序?
答案 0 :(得分:6)
我想这是特定于实现的。如果实现是桶哈希映射,则具有相同密钥的unordered_multimap
元素存储在同一个桶中,在这种情况下,它们可以采用相同的插入顺序(可能是您的情况)。
但是在实施的unordered_map
中,例如,使用开放寻址技术,订单可能会发生变化。我不知道是否有STL实现使用不同的引擎实现,但类的合同没有对相同键的值的顺序做任何假设,所以我不认为你可以采取它理所当然的。
取自here:
在内部,unordered_map中的元素没有按照其键值或映射值的任何特定顺序排序
答案 1 :(得分:3)
名称中“无序”的全部意义在于您不能依赖订单。如初。
如果您检测到来自迭代容器的任何订单,则这是实现的巧合或工件。你应该从不指望它。
答案 2 :(得分:2)
除非文档说明他们将始终以插入顺序返回,否则你会依赖它做错事。您今天使用的STL实现可能会发生变化。如果地图中有很多条目,那么您正在使用的实现可能会以不同的方式工作。