Как вставить пару в карту - PullRequest
       3

Как вставить пару в карту

12 голосов
/ 22 февраля 2010

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

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

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

Ответы [ 4 ]

20 голосов
/ 22 февраля 2010
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));
11 голосов
/ 13 ноября 2013

Предполагая, что вы используете 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). Это было исправлено в стандарте, но ваша реализация стандартной библиотеки, возможно, еще не подобрала это исправление. Это также теоретически может быть немного менее эффективным, но таким образом, что любой наполовину достойный компилятор может легко оптимизировать.

1 голос
/ 22 февраля 2010

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

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 голосов
/ 27 мая 2019

int a = 10, b = 20;

map , int> m;

pair numbers = make_pair (a, b);

int sum = a + b;

м [числа] = сумма;

Наша карта будет иметь ключ в виде пар чисел. Мы можем получить доступ к целочисленным значениям парной переменной, используя оператор точки (.)

...