2016-01-03 23 views
9

std::unordered_multimap var ve belirli bir anahtarın en son eklenen elemanını almak istiyorum.Sırasız bir haritanın sırasına güvenebilir miyim?

#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; 
} 

Bu kod çıkışları:

last 
3 

Bu, en azından, GCC üzerine, davranış istediğim I bu davranışı gözlendi. Buna güvenebilir miyim? Standart, std::unordered_multimap ürününün siparişi hakkında bir şeyler söylüyor mu? Değilse, en iyi alternatif ne olurdu? Neredeyse her şey için

+0

Sen 'İlk 1' ile [++ libc] (http://coliru.stacked-crooked.com/a/f8f56abb25674bbe) elde edersiniz. –

cevap

8

.

[C++14: 24.2.5/6]:[..] eşdeğer tuşları destek kaplarda eşdeğer tuşlarıyla elemanlarının konteynerin yineleme olarak birbirine bitişiktir. Bu nedenle, , sırasız bir kapsayıcıda öğelerin mutlak sırasına göre belirtilmemiş olsa da, öğeleri, her grubun tüm öğelerinin eşdeğer anahtarları olacağı şekilde eşdeğer anahtar gruplarına gruplandırılır. Sırasız kaplarda mutasyon işlemleri, aksi belirtilmedikçe her bir eşdeğer anahtar grubu içindeki öğelerin göreceli sırasını korur.

[C++14: 24.2.5/9]:[..] unordered_multiset ve unordered_multimap için, rehashing eşdeğer elemanlar göreli sipariş korur.

Ben söyleyebilirim gelen, oldukça garip ifadeler var ama genel kavram en azından hemen hemen sonrasında aynı kalır gerçi eşdeğer tuşlarını altında elemanların düzeni, tanımlanmamış olmasıdır.

Yani:

Sen ekleme talimatına güvenemez, ancak dikkatli olursanız muhtemelen istikrarlı sipariş güvenebilirsiniz.

Bu sıralı birleştirici kaplarla zıttır: multiset ve Multimap'de, insert, yerleştirmek ve eşdeğer elemanların nispi talimatlarını koruması silmek için

[C++14: 23.2.4/4]:.

+4

Ancak, yeni öğenin eklendiği yerde belirtilmemiş. Eğer 'eşdeğer anahtar grubunda a, b, C' var ve 'D', a'' göreli sırasını, 'b' yerleştirin ve varsa' C' değişmez, ancak 'd ekleyebilirsiniz dört yerden herhangi birinde. –

+0

@ T.C. ya tamam olabilir de olmayabilir de hangi –

1

std::unordered_multimap (tabii ki) sıralı veya stabilgerçekleştirilmez. Yani, std::unordered_multimap'a eşdeğer öğeleri koyduğunuz sıra, hiçbir şekilde standardın tutarlılığını garanti etmez.

+0

ifade istikrar güçlü derecede önerir. –

+0

@LightnessRacesinOrbit eşdeğer elemanları sadece yineleme için bitişik bir alt aralık içinde olduğu garanti edilir. –

+0

@P aulEvans Biliyorum. –

İlgili konular