2011-12-13 2 views
0

Действительно ли нет гарантированного заказа в unordered_map? Я прошу об этом, потому что я хотел бы указать порядок для unorderded_map, чтобы можно было итератировать контейнер от begin() до end() в соответствии с указанным заказом (сохраняя при этом эффективность хеширования доступа к отдельным элементам во всем мире).Можно ли указать заказ на неупорядоченный_мап?

+17

Очевидно, что присвоение имени 'unordered_map' было недостаточным для получения сообщения через ... – Jon

+2

Посмотрите на [Boost.MultiIndex] (http://www.boost.org/doc/libs/1_48_0/libs/multi_index/ DOC/index.html). Я не знаком с этим достаточно, чтобы рассказать вам пример, но я уверен, что решение вашей проблемы где угодно, оно есть. –

ответ

8

Вы знаете, он имеет свое название по причине ...

Чтобы действительно дать ему заказ, вам нужно реализовать свой собственный хэш, который каким-то образом дает вам разыскиваемого заказ.

Теперь, для решения вашей конкретной проблемы, вы можете просто создать std::map от вашего std::unordered_map, и даже с минимальными затратами для вставки (не копии):

#include <iostream> 
#include <unordered_map> 
#include <map> 
#include <functional> 

int main() 
{ 
    std::unordered_map<int, int> m; 
    m[5] = 1; 
    m[4] = 2; 
    m[3] = 3; 
    m[2] = 4; 
    m[1] = 5; 
    typedef std::reference_wrapper<const int> cref_int; 
    typedef std::reference_wrapper<int> ref_int; 
    std::map<cref_int, ref_int> ordered(m.begin(), m.end()); 
    for(auto it=ordered.begin(), ite=ordered.end(); it != ite; ++it){ 
     std::cout << it->second << '\n'; 
    } 
} 
+1

И гарантирует ли он гарантированный заказ для конкретной реализации хэша? Я сомневаюсь в этом. – jpalecek

+0

@jpalecek: Может быть, вы каким-то образом можете создать алгоритм хэширования, специально подходящий для ваших нужд, который каким-то образом дает желаемый результат? : P Обратите внимание на «как-то». – Xeo

+0

@Xeo: как бы алгоритм хеширования упорядочил встречные хэши? И что происходит, когда контейнер изменяется и перерисовывается? –

5

Конечно нет. Если вам нужен заказ, используйте обычную карту.

Смежные вопросы