C++ std::无序_多重映射中元素的顺序

C++ std::无序_多重映射中元素的顺序,c++,stl,multimap,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::m

如果我有下面的代码

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));
std::无序的\u多重映射myMap;
std::向量v1、v2、v3;
//初始v1、v2、v3。。。。

myMap.insert(std::make_pair我想这是特定于实现的。在
无序多映射中,如果实现是一个bucket散列映射,则具有相同键的元素存储在同一个bucket中,在这种情况下,它们的插入顺序可能相同(这可能是您的情况)

但是在一个实现的
无序映射中,例如,使用开放寻址技术,顺序可能会改变。我不知道是否有STL实现使用不同的底层实现,但是类的契约没有对同一个键的值的顺序做任何假设,所以我想你不能这是理所当然的

摘自:

在内部,无序_映射中的元素不会按照其键或映射值的任何特定顺序进行排序

名称中“无序”的全部意义在于,你不能依赖顺序。永远


如果您检测到任何来自容器迭代的顺序,这是巧合或是实现的产物。您永远不要指望它。

除非文档说明它们总是以插入顺序返回,否则依赖它将是错误的。您今天使用的STL实现可能会改变。它也会改变可能的情况是,如果在地图中有很多条目,你所使用的实现方式会不同。

使用无序容器的最佳方法是根本不考虑订单。根本不依赖订单。如果你因为某些原因查看元素的顺序,那么你可能使用错误的容器。it’不能保证它会保留插入顺序。@特洛伊,我可以改用std::multimap吗?如果你需要关联容器中的插入顺序,你可能需要类似于boost的multi_index的东西。关于这一点还有其他问题。我想你是对的,但无序部分不是指键,而不是值吗?@AlexChamberla在中,它指的是容器所做的保证。在这种情况下,对键和值都没有保证。为了保持插入顺序,我可以使用简单的多重映射吗?对于
unordered_multimap
,没有对值顺序的保证,可能在90%的实现下它可以工作,但它不是在任何情况下都不允许。抱歉,我指的是std::multimap而不是std::unordered\u multimap必须对具有相同键的元素的顺序进行排序。这是为了实现。还说:
您始终可以保证,但是,具有等效顺序的元素的任何子集在受控序列中都是相邻的。
@djWann:I s应该澄清的是,这不是一个总的顺序,只是具有相同值的元素是相邻的。