2010-02-22 4 views
12

У меня есть следующая структура карты: map < pair < int,int >, object* > и я хочу в нее вставить.Как вставить пару в карту

Как бы сделать это, так как я пытаюсь вставить пару и объект и я должен сделать пару из этого?

Должен ли я создать новую пару, используя make_pair() из пары и объекта, которые у меня есть? Если да, не могли бы вы сообщить мне, как это сделать?

+5

Какой код вы старались? – Mark

ответ

20
object * myObject = // get an object somehow 
myMap.insert(std::make_pair(std::make_pair(1,2), myObject)); 

или

typedef map<pair<int, int>, object *> MapType; 
object * myObject = // get an object somehow 
myMap.insert(MapType::value_type(std::make_pair(1,2), myObject)); 
+0

Я использовал ваше первое предложение - красивое и лаконичное. Спасибо! – Myx

+2

Если вы используете это в своем коде, вы можете поместить карту вверх в класс с функцией insert (pair, object) для удобочитаемости. –

1

Есть два способа:

typedef std::map<int,Object> map_t; 
map_t map; 
Object obj; 

std::pair<map_t::iterator, bool> result = map.insert(std::make_pair(1,obj)); // 1 

map[1] = obj; // 2 
  1. работает только если ключ не присутствует, итератор указывает на пару с ключевым значением и bool указывает, была ли она вставлена ​​или нет.

  2. Легче, но если это уже не существует объект является первым конструктором по умолчанию, а затем назначен вместо того, чтобы быть копия построена

Если вам не придется беспокоиться о производительности, просто выбрать по ли или вы не хотите удалить предыдущую запись.

+0

Правильно, но вопрос задан о карте с типом ключа, который также является парой. –

+0

Я не вижу зависимости. 'sed s/1/std :: make_pair (1,1)/g' и подходящим образом заданный' map_t'. Это не меняет комментариев или что-то еще, я просто предпочитаю демонстрировать с помощью простых понятий, которые помогут сосредоточиться на важных моментах, а не скрывать их в толпе. –

10

Предполагая, что вы используете C++ 11 или более поздней версии, лучший подход, вероятно:

object * myObject = // get an object somehow 
myMap.emplace({1,2}, myObject); 

Для карт emplace можно рассматривать как вариант insert, который принимает ключ и значение в качестве отдельного аргументов (он может фактически принимать любую комбинацию аргументов, которые могут принимать соответствующие конструкторы типа pair). В дополнение к синтаксически более чистым, он также потенциально более эффективен, чем make_pair, потому что make_pair обычно производит вывод, тип которого точно не соответствует value_type контейнера, и поэтому он требует ненужного преобразования типов.

Я использовал, чтобы рекомендовать, который также работает только в C++ 11 или более поздней версии:

object * myObject = // get an object somehow 
myMap.insert({{1,2}, myObject}); 

Это позволяет избежать немного неожиданное применение emplace, но ранее не работал, если ключ или значение тип - только для перемещения (например, unique_ptr). Это было исправлено в стандарте, но ваша стандартная реализация библиотеки, возможно, еще не взяла исправление. Это также теоретически может быть немного менее эффективным, но таким образом, чтобы любой наполовину достойный компилятор мог легко оптимизировать ситуацию.

+0

Я думаю, что официальный ответ и этот должен быть объединен на основе критериев версии компилятора – Aviv

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