Как запустить определенные тесты, используя дотнет-тест?

Сделать val mutable as:

mutable int val;

Теперь вы можете изменять / изменять / мутировать val, даже если foo const:

void f(const Foo & foo)
{
     foo.val = 10;  //ok
     foo.id  = 11;  //compilation error - id is not mutable.
}

By Кстати, из вашего кода вы, кажется, думаете, что если p.second истинно, то значение уже существует в наборе, и поэтому вы обновляете связанное значение. Думаю, вы ошибаетесь. На самом деле это наоборот. doc в cpluscplus говорит:

Пара :: второй элемент в паре имеет значение true, если новый элемент был вставлен или false, если элемент с тем же

blockquote>

, что является правильным, на мой взгляд.


Однако, если вы используете std::map, ваше решение будет простым:

void update(std::map & m, std::pair value) 
{
    m[value.first] += value.second;
}

Что делает этот код? m[value.first] создает новую запись, если ключ не существует на карте, а значением новой записи является значение по умолчанию int, которое равно нулю. Поэтому он добавляет value.second в zero. Или, если ключ существует, он просто добавляет к нему value.second. То есть приведенный выше код эквивалентен этому:

void update(std::map & m, std::pair value) 
{
    std::map::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
    }
}

Но это слишком много, не так ли? Это не очень хорошо. Более ранний из них более лаконичен и очень эффективен.

40
задан Nate Barbettini 10 June 2016 в 15:45
поделиться