Почему пару необходимо вставить в карту?

Хотя мне это не нравится, но мне неудобно объявлять объект pair<X,Y> или вызывать make_pair, чтобы вызвать map::insert. Почему insert не принимает два аргумента вместо того, чтобы указать ключ и значение соответственно.

Хотя я понимаю, что это для совместимости с другими контейнерами STL, которые показывают value_type. Но метод find принимает key_type, что нарушает это утверждение совместимости. map содержит key_type и mapped_type, поэтому не могу map иметь:

iterator insert(const key_type&, const mapped_type&);

Да, имеются перегрузки insert, принимающих итераторы. Но этот аргумент с двумя аргументами insert мог бы быть хорошо смешан.

Я вижу только одно преимущество: меньшее использование стека вызовов.

ИЗМЕНИТЬ : Только что обнаружил, что insert - это метод only , который принимает value_type, то есть pair<X,Y>. Многие другие методы, такие как find, erase, at, count, equal_range, lower_bound, upper_bound и operator[] взять key_type

7 голосов | спросил Ajay 20 Jpm1000000pmMon, 20 Jan 2014 17:10:51 +040014 2014, 17:10:51

1 ответ


0

Все стандартные контейнеры библиотеки определяют тип элемента value_type, и их интерфейсы обычно работают в терминах этого value_type: insert, push_back, push_front. Новый интерфейс emplace добавляет способ создания value_type объект как бы по:

value_type(std::forward<Args>(args)...)

По сути, для ассоциативных контейнеров спутниковых данных (т. е. карт) не предусмотрен специальный интерфейс, который знает о специальной структуре value_type (который определен, но не совсем известен как pair<const key_type, mapped_type>), за исключением find и erase и operator[], которые принимают аргументы key_type.

Возможно, это упущение стандарта, или, возможно, это никогда не считалось проблемой, поскольку вы всегда можете использовать make_pair , make_tuple или forward_as_tuple или emplace, чтобы создать типы значений карты.

(Существует одна проблема с insert и отображаемыми типами только для перемещения, которая обнаружена и является объектом это недавнее предложение .)

ответил Kerrek SB 20 Jpm1000000pmMon, 20 Jan 2014 17:35:20 +040014 2014, 17:35:20

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132