Всегда ли карта STL дает одинаковый порядок при переходе от begin () к end ()? - PullRequest
8 голосов
/ 11 июня 2009

Как видно из моего простого тестирования, но мне интересно, гарантируется ли это?

Существуют ли условия, при которых заказ не будет гарантирован?

Редактировать : Мне особенно интересен случай, если я заполню карту большим количеством записей, будет ли порядок иертатора одинаковым при нескольких запусках моего исполняемого файла? Что делать, если записи вставлены в другом порядке?

Ответы [ 5 ]

9 голосов
/ 11 июня 2009

Да, он поддерживает внутренний порядок, поэтому итерации по набору, который не меняется, всегда должны быть одинаковыми. С здесь :

Внутренне, элементы на карте сортируются по убыванию значение после конкретной строгой слабости критерий заказа установлен на строительство.

6 голосов
/ 11 июня 2009

std::map является отсортированным контейнером, поэтому, да, порядок гарантирован (такой же, как порядок, который вы используете неявно или явно в его конструкторе). не рассчитывает на это для популярного (хотя и не стандартного) hashmap, хотя - во многих случаях у него очень много преимуществ по std::map, но не a предсказуемый порядок итерации!

1 голос
/ 11 июня 2009

std :: map - отсортированная коллекция
и вам придется определить оператор меньше чем
представьте, что m - это карта типа T:

assert(m.size() > 1);
for (std::map<T>::const_iterator i = m.begin(); i != m.end(); ++i) {
    std::map<T>::const_iterator j = i + 1;
    while ( j != m.end() ) {
        assert(*i < *j);
        ++j;
    }
}
0 голосов
/ 11 июня 2009

На одном и том же наборе данных при той же реализации STL, да. Насколько я знаю, это не обязательно будет одинаковым в разных реализациях.

0 голосов
/ 11 июня 2009

Даст ли карта STL такой же порядок с началом / концом, если она не изменилась? Да. Если вы измените карту, не зависите от того, какой порядок останется прежним.

...