Я имею в виду, что мы знаем, что std::map
элементы отсортированы по ключам. Итак, допустим, что ключи являются целыми числами. Если я итерация от std::map::begin()
с std::map::end()
использованием for
, делает стандартную гарантию того, что я буду перебирать , следовательно , через элементы с ключами, сортируются в порядке возрастания?
Пример:
std::map<int, int> map_;
map_[1] = 2;
map_[2] = 3;
map_[3] = 4;
for( std::map<int, int>::iterator iter = map_.begin();
iter != map_.end();
++iter )
{
std::cout << iter->second;
}
Это гарантированно печатать 234
или это определяется реализацией?
Причина реальной жизни: у меня есть std::map
с int
ключами. В очень редких ситуациях я хотел бы пройтись по всем элементам, причем ключ больше конкретного int
значения. Да, это звучит как std::vector
лучший выбор, но обратите внимание на мои "очень редкие ситуации".
РЕДАКТИРОВАТЬ : Я знаю, что элементы std::map
отсортированы .. нет необходимости указывать на это (для большинства ответов здесь). Я даже написал это в своем вопросе.
Я спрашивал об итераторах и порядке, когда я перебираю контейнер. Спасибо @Kerrek SB за ответ.
источник
map::upper_bound
чтобы найти точку для начала итерации.Ответы:
Да, это гарантировано. Кроме того,
*begin()
дает самый маленький и*rbegin()
самый большой элемент, как определено оператором сравнения, а также два ключевых значенийa
иb
для которых выражение!compare(a,b) && !compare(b,a)
истинно считаются равными. Функция сравнения по умолчаниюstd::less<K>
.Упорядочение не является счастливой бонусной функцией, а скорее является фундаментальным аспектом структуры данных, так как упорядочение используется для определения того, когда два ключа одинаковы (по вышеприведенному правилу), и для эффективного поиска (по существу, двоичного кода). поиск, который имеет логарифмическую сложность по количеству элементов).
источник
std::unordered_map
имеет более эффективное время поиска O (1). Преимуществоstd::map
заключается в упорядочивании ключей, а не в поиске.Это гарантировано ассоциативными требованиями к контейнерам в стандарте C ++. Например, см. 23.2.4 / 10 в C ++ 11:
и 23.2.4 / 11
источник
Я думаю, что в структурах данных есть путаница.
В большинстве языков a
map
- это просто AssociativeContainer: он сопоставляет ключ со значением. В «более новых» языках это обычно достигается с помощью хэш-карты, поэтому порядок не гарантируется.Однако в C ++ это не так:
std::map
это сортируется ассоциативный контейнерstd::unordered_map
ассоциативный контейнер на основе хеш-таблицы, представленный в C ++ 11Итак, для уточнения гарантий по оформлению заказа.
В C ++ 03:
std::set
,std::multiset
,std::map
Иstd::multimap
гарантированно будут упорядочены в соответствии с ключами (и критерий входит в комплект)std::multiset
иstd::multimap
стандарт не накладывает никаких гарантий порядка на эквивалентные элементы (то есть те, которые сравнивают равные)В C ++ 11:
std::set
,std::multiset
,std::map
Иstd::multimap
гарантированно будут упорядочены в соответствии с ключами (и критерий входит в комплект)std::multiset
иstd::multimap
стандарт устанавливает, что эквивалентные элементы (те, которые сравниваются равными) упорядочены в соответствии с порядком их вставки (сначала вставляются в первую очередь)std::unordered_*
Контейнеры, как следует из названия, не заказаны. В частности, порядок элементов может изменяться при изменении контейнера (при вставке / удалении).Когда в стандарте говорится, что элементы упорядочены таким образом, это означает, что:
Я надеюсь, что это устранит любую путаницу.
источник
Да,
std::map
это отсортированный контейнер, заказанныйKey
с поставляемымComparator
. Так что это гарантировано.Это, безусловно, возможно.
источник
Да ... элементы в a
std::map
имеют строгий слабый порядок, что означает, что элементы будут составлены из набора (т. Е. Не будет повторений «равных» ключей), и равенство определяется путем тестирования на любом две клавиши A и B, что если ключ A не меньше ключа B, а B не меньше A, то ключ A равен ключу B.При этом вы не можете правильно отсортировать элементы a,
std::map
если слабый порядок для этого типа неоднозначен (в вашем случае, когда вы используете целые числа в качестве типа ключа, это не проблема). Вы должны быть в состоянии определить операцию, которая определяет общий порядок для типа, который вы используете для ключей в вашемstd::map
, иначе у вас будет только частичный порядок для ваших элементов, или poset, у которого есть свойство, где A может быть несопоставимым с B. Что обычно происходит в этом сценарии, так это то, что вы сможете вставить пары ключ / значение, но у вас могут получиться дублирующие пары ключ / значение, если вы выполните итерацию по всей карте и / или обнаружите «пропущенные» пары ключ / значение при попытке выполнитьstd::map::find()
определенную пару ключ / значение на карте.источник
begin () может дать наименьший элемент. Но это зависит от реализации. Это указано в стандарте C ++? Если нет, то делать такое предположение опасно.
источник