Как вставить пару в карту
У меня есть следующая структура карты: map < pair < int,int >, object* >
и я хочу в нее вставить.
Как мне это сделать, поскольку я пытаюсь вставить пару и объект, и я должен сделать пару из этого?
Должен ли я создать новую пару с помощью make_pair()
из пары и объекта, который у меня есть? Если да, не могли бы вы сообщить мне, как это сделать?
Ответы
Ответ 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;
Наша карта будет иметь ключ в виде пар чисел. Мы можем получить доступ к целочисленным значениям парной переменной с помощью оператора точки (.).