Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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));

Ответ 2

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

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

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

Я рекомендовал это, что также работает только на С++ 11 или новее:

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

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

Ответ 3

Существует два способа:

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
  • Работает только в том случае, если ключ еще не присутствует, итератор указывает на пару с ключом, а bool указывает, была ли она вставлена ​​или нет.

  • Легче, но если он еще не существует, объект сначала создается по умолчанию, а затем назначается вместо созданной копии

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

Ответ 4

int a=10,b=20;

map < pair < int,int >, int > m;

pair < int,int >numbers = make_pair(a,b);

int sum=a+b;

m[numbers]=sum;

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