2016-01-03 8 views
9

私にはstd::unordered_multimapがあり、特定のキーの最後に挿入された要素を取得したいと考えています。私はこの振る舞いを観察:順序のない地図の順序に頼ることはできますか?

#include <iostream> 
#include <string> 
#include <unordered_map> 

using namespace std; 

int main() { 
    unordered_multimap<string, string> mmap; 

    mmap.emplace("a", "first"); 
    mmap.emplace("a", "second"); 
    mmap.emplace("a", "last"); 
    mmap.emplace("b", "1"); 
    mmap.emplace("b", "2"); 
    mmap.emplace("b", "3"); 

    auto last_a = mmap.equal_range("a").first; 
    auto last_b = mmap.equal_range("b").first; 

    cout << last_a->second << endl; 
    cout << last_b->second << endl; 

    return 0; 
} 

このコードの出力は:

last 
3 

これは、GCC、私が欲しいの行動に、少なくとも、です。私はこれに頼ることができますか?スタンダードは、std::unordered_multimapのものを保管する注文についての説明をしていますか?そうでない場合、最良の選択肢は何ですか?

+0

あなたは[libC++](http://coliru.stacked-crooked.com/a/f8f56abb25674bbe)で 'first 1'を得るでしょう。 –

答えて

8

ほぼ。等価のキーをサポートするコンテナに

[C++14: 24.2.5/6]:[..]、同等のキーを持つ要素は、容器の繰り返し順序で互いに隣接しています。したがって、は、順序付けられていないコンテナ内の要素の絶対順序は指定されていない、その要素は、各グループのすべての要素が同等のキーを持つ等価キーグループにグループ化されます。 順序付けられていないコンテナに対する操作は、別段の指定がない限り、各等価キーグループ内の要素の相対的な順序を保持しなければならない。 unordered_multisetとunordered_multimapについて

[C++14: 24.2.5/9]:[..]、再ハッシュは、同等の要素の相対的な順序を保存します。

それはかなり厄介な言い回しだが、私が言うことができるものから、一般的な概念は、それが、少なくともほとんど後で同じままかかわらず、同等のキーの下の要素の順序は、指定されていないということです。だから、

あなたは挿入順序に依存することはできませんが、あなたが注意している場合、あなたはおそらく安定した順序に依存することができます。マルチセットおよびマルチマップのために

[C++14: 23.2.4/4]:、据え付ける、挿入、および同等の構成要素の相対的な順序を保存消去:

これは注文した連想コンテナとは対照的です。

+4

しかし、新しい要素がどこに挿入されるかは指定されていません。等価キーグループに 'a、b、c'があり、' d'を挿入すると 'a'、' b''、 'c'の相対的な順序は変わりませんが、' d 「4つの場所のいずれかで。 –

+0

@ T.C。どちらが良いかどうかは分かりません –

1

std::unordered_multimap注文していない(当然)も安定もされていません。したがって、同等の要素をstd::unordered_multimapに入れた順番は、規格によって一貫していることは決して保証されません。

+0

この文言は、強い安定性を示唆しています。 –

+0

@ LightnessRacesinOrbitの同等の要素は、反復順序の連続した部分範囲内にあることが保証されています。 –

+0

@P aulEvans私は認識しています。 –