2017-01-06 7 views
2

Этот синтаксис:Почему std :: map берет пару?

std::map<int, int> m; 
m.insert(std::make_pair(1, 42)); 

кажется немного сумасшедшим.

Почему не существует никакой альтернативы insert(K k, V v) метода, который обеспечит гораздо разумнее:

std::map<int, int> m; 
m.insert(1, 42); 

Да, я в курсе m[1] = 42, но у него есть свои собственные проблемы (создание дополнительной копии объекта значения) ,

+3

'm.emplace (1, 42)'? –

+1

Согласованность и история, я думаю. Я думаю, что «карта» уже работала так, как в исходном STL, прежде чем она была включена в стандартную библиотеку, а так как тип значения контейнера * - это пара, использование пары в качестве типа параметра является просто самым логичным способом. AFAIK, 'operator []' был запоздалой мыслью, спроектированной как (непоследовательная) функция удобства, чтобы обеспечить «более здравую» альтернативу, которую вы просите. –

ответ

5

Я не могу сказать вам, почему эта конструкция не допускается. Возможно, сохранить insert, аналогичный методу других контейнеров insert. Однако, поскольку C++ 11, есть map::emplace, который делает то, что вы хотите.

std::map<int, int> m; 
m.emplace(1, 42); 
-2

m.insert(x, y); заставляет копировать два параметра; тогда как m.insert(std::make_pair(1, 42)); позволяет получить код const& pair, который позволяет избежать всего копирования. Таким образом, map может содержать непригодные объекты (или объекты с большой нагрузкой)

+0

Так что создание пары 'std :: make_pair' не приводит к копированию? –

+2

Напротив, подход 'make_pair' поощряет создание неправильно введенного объекта пары, который не может быть передан непосредственно в' insert' и требует дополнительного преобразования, то есть дополнительной копии. Ваш пример действительно хорошо освещает эту популярную ошибку. Ваш 'make_pair' создаст пару' ', а' insert' требует пару ''. Компилятор не будет жаловаться, потому что первая неявно конвертируется в последнюю. Но преобразование создаст временную копию. Так что привет, ненужное копирование! – AnT

+0

@ Вы можете уточнить, что не так с make_pair в его примере? Это не состязание? –

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

  • Нет связанных вопросов^_^