Сделать val
изменяемым как:
mutable int val;
Теперь вы можете изменить / изменить / изменить val
, даже если foo
равно:
void f(const Foo & foo)
{
foo.val = 10; //ok
foo.id = 11; //compilation error - id is not mutable.
}
Между прочим, из вашего кода вы, кажется, думаете, что если p.second
истинно, то значение уже существует в наборе, и поэтому вы обновляете связанное значение. Я думаю, вы ошиблись. На самом деле все наоборот. doc в cpluscplus говорит:
Элемент pair :: second в паре устанавливается равным true, если был вставлен новый элемент, или false, если существовал элемент с таким же значением.
что правильно, на мой взгляд.
Однако, если вы используете std::map
, ваше решение будет простым:
void update(std::map<int,int> & m, std::pair<int,int> value)
{
m[value.first] += value.second;
}
Что делает этот код? m[value.first]
создает новую запись, если ключ не существует на карте, и значением новой записи является значение по умолчанию int
, которое равно нулю. Таким образом, это добавляет value.second
к zero
. Или, если ключ существует, он просто добавляет value.second
к нему. То есть приведенный выше код эквивалентен этому:
void update(std::map<int,int> & m, std::pair<int,int> value)
{
std::map<int,int>::iterator it = m.find(value);
if ( it != m.end()) //found or not?
it.second += value; //add if found
else
{
m.insert(value); //insert if not found
}
}
Но это слишком, не правда ли? Это производительность не хорошо. Более ранний вариант более лаконичен и очень производителен.