Двунаправленные итераторы в неупорядоченной карте?

следующий минимальный пример:

#include <iostream>

#include <boost/unordered_map.hpp>

int main()
{
        boost::unordered_map<int, int> m;
        boost::unordered_map<int, int>::const_iterator i;

        m.insert(std::make_pair(1, 2));

        i = m.end();
        --i;

        std::cout << i->first << " -> " << i->second << std::endl;

        return 0;
}

...не удается скомпилировать.

bidi.cxx: In function ‘int main()’:
bidi.cxx:13: error: no match for ‘operator--’ in ‘--i’

по данным собственная документация Boost:

iterator, const_iterator не менее прямого категория.

похоже, что это все, что они есть. Почему? Какое техническое ограничение накладывает хэш-карта, которая предотвращает двунаправленность итераторов?

(gcc версии 4.1.2, Boost версии 1.40.0 и 1.43.0.)

1 ответов


нет никакой технической причины, почему unordered_map не может иметь двунаправленных итераторов. Основная причина заключается в том, что это добавит дополнительные затраты на реализацию, и дизайнеры думали, что никому не понадобятся двунаправленные итераторы в хэш-карте. В конце концов, в хэше нет порядка, и поэтому порядок, который дает вам итератор, полностью произволен. Что даст вам прохождение фиксированного, но произвольного порядка назад?

обычно можно получить доступ к unordered_map на элемент за элементом, или пересечь всю карту. Я никогда не делал иначе в Perl, сам. Для этого необходим прямой итератор, и поэтому там есть один, и Boost гарантирует его. Чтобы иметь двунаправленные итераторы, вероятно, потребуется включить дополнительный указатель в каждую запись, что увеличивает использование памяти и время обработки.

Я не придумываю хороший, правдоподобный вариант использования для двунаправленных итераторов здесь. Если вы можете, вы можете спросить Повысьте сопровождающих, чтобы рассмотреть это, хотя вы почти наверняка слишком поздно для C++0x.