Как установить размер и инициализировать карту в ноль в C ++ - PullRequest
3 голосов
/ 04 июня 2011

Я объявляю карту типа map<string,int> registers. Как я могу установить для него определенный размер и как я могу установить все его значения в нули, чтобы впоследствии я мог вставить значения в сопоставленное значение?

Ответы [ 2 ]

8 голосов
/ 04 июня 2011

Как насчет этого:

std::map<std::string, int>   registers; // done.
                                        // All keys will return a value of int() which is 0.


std::cout << registers["Plop"] << std::endl; // prints 0.

Это работает, потому что даже если registers пусто.Оператор [] вставит ключ в карту и определит его значение в качестве значения по умолчанию для типа (в данном случае целые числа равны нулю).

Итак, подвыражение:

registers["Plop"];

Эквивалентно:

if (registers.find("Plop") == registers.end())
{
    registers.insert(make_pair("Plop", 0));
}
return registers.find("Plop").second;  // return the value to be used in the expression.

Это также означает, что следующее работает нормально (даже если вы не определили ключ ранее).

registers["AnotherKey"]++; // Increment the value for "AnotherKey"
                           // If this value was not previously inserted it will
                           // first be inserted with the value 0. Then it will  
                           // be incremented by the operator ++

std::cout << registers["AnotherKey"] << std::end; // prints 1
2 голосов
/ 04 июня 2011

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

Это, вероятно, гораздо больше концептуальной проблемы, чем проблема синтаксиса / "как". Да, это правда, что при первоначальном доступе с данным ключом будет создано соответствующее значение и по умолчанию установлено значение 0, как сказали многие авторы / комментаторы. Но важная фраза, которую вы использовали, которая не подходит:

все его значения

У него нет значений для начала, и если вы программируете с предположением, что это так, это само по себе может стать причиной концептуальных ошибок.

Обычно лучше иметь привычку выяснять, есть ли ключ на вашей карте, а затем, если нет, сделать что-то для его инициализации. Даже если это может показаться просто накладными расходами, выполнение таких явных действий, вероятно, предотвратит концептуальные ошибки в будущем, особенно когда вы пытаетесь получить доступ к значению ключа, не зная, было ли оно уже на карте.

Сводка в одну строку: разве вы не хотите инициализировать значение самостоятельно, вместо того, чтобы карта назначала его значение по умолчанию для любого заданного значения ключа?

Таким образом, код, который вы, вероятно, хотите использовать:

    if(mymap.find(someKey) == mymap.end())
    {
        // initialize it explicitly
        mymap[someKey] = someInitialValue;
    }
    else
    {
        // it has a value, now you can use it, increment it, whatever
        mymap[someKey] += someIncrement;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...