Использование карты, содержащей набор в качестве значения - PullRequest
1 голос
/ 06 апреля 2009

В основном у меня есть,

typedef  map<std::string, set<double> > MAP_STRING_TO_SET;

Каков наилучший способ обновить (добавить или удалить значение) набор новым значением, не вызывая копирование набора?

Единственное жизнеспособное решение, которое я вижу, это использовать map<std::string, set<double>* > - то, чего я не хочу делать.

Спасибо

Ответы [ 3 ]

13 голосов
/ 06 апреля 2009

Набор копируется только при инициализации. Вам разрешено делать что-то вроде

myMap[myString].insert(myDouble);

, поскольку map :: operator [] возвращает ссылку.

0 голосов
/ 06 апреля 2009

Вы также можете сделать это:

map<std::string, set<double> >::iterator iter = myMap.find(myString);
if(iter != myMap.end())
{
 iter->second.insert(myDouble);
}
0 голосов
/ 06 апреля 2009

Я думаю, что вы можете просто использовать своп - например,

my_map["123"].swap(my_set)

при условии забивания my_set не имеет значения для вас. Это поменяет предыдущее содержимое my_map["123"] на my_set, и это быстро.

Оператор индексирования [] возвращает ссылку на содержащийся set - поэтому вы можете манипулировать им так же, как и любой другой переменной. Если вы хотите добавить / удалить отдельные значения, вы можете просто использовать insert() или erase() методы - например. my_map["123"].insert(123).

Копирование фактически происходит, когда вы назначаете новый набор на карту - например,

my_map["123"]=my_set

создаст копию my_set. Если вам не нужно использовать значение my_set позже, вы можете использовать метод swap(), который будет просто перетасовывать указатели из двух наборов. Однако my_set будет содержать содержимое предыдущего my_map["123"].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...