2013-01-15 63 views
3

如果我有下面一段代码顺序的std :: unordered_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

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

+2

使用无序容器的最佳方式是根本不考虑顺序。完全不依赖订单。如果您出于某种原因查看元素的顺序,则可能是使用了错误的容器。不保证它会保留广告订单。 – goji

+0

@Troy我可以使用std :: multimap吗? – djWann

+2

如果你需要在一个容器中使用插入顺序,你可能需要类似boost的multi_index。还有其他关于这个问题。 – goji

回答

6

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

但是在例如使用开放寻址技术实现的unordered_map中,顺序可能改变。我不知道是否有STL实现在实现中使用了不同的方法,但是类的合同没有对同一个键的值的顺序做任何假设,所以我不认为你可以把它用于理所当然的。

here摘自:

在内部,在unordered_map的元素是不能以任何特定次序来分类的相对于任一它们的键或映射的值

+0

为了保持插入顺序,我可以使用一个简单的multimap? – djWann

+1

无论使用'unordered_multimap',都没有值的顺序保证,可能在90%以下的实现中工作,但在任何情况下都不会被授予。 – Jack

+0

对不起,我指的是std :: multimap不是std :: unordered_multimap – djWann

4

整点“无序”在名义上是你不能依赖订单。永远。

如果您检测到来自迭代容器的任何订单,那么这是实现的巧合或人为因素。你应该从来没有指望它。

+2

我认为你是正确的,但不是无序的部分是指键,而不是值? –

+0

@AlexChamberlain,它是指集装箱所做的保证。在这种情况下,无论是关键还是价值都没有保证。 –

2

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