Как инициализировать поле структуры std :: map <std :: string, std :: string> с именем params - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь инициализировать структуру, используя некоторые данные, хранящиеся в std::vector<tokens> - токены - это просто строки. Моя структура:

struct parsedBlock{
std::string name;
std::map<std::string, std::string> params;
} 

parsedBlock block;

токены [0] - это block.name, поэтому просто написать block.name = tokens[0] Но вопрос в том, как инициализировать поле params, предполагая, что ключ равен tokens[i], а значение равно tokens[i+1]. Заранее спасибо. Привет!

1 Ответ

0 голосов
/ 09 января 2019

Я полагаю, что ваш вектор "токенов" содержит имя с индексом 0 в качестве специального значения, а все последующие значения - это ключи / значения, которые вы хотите получить на карте "params".

По-другому, нечетные индексы (1, 3, 5 и т. Д.) Являются ключами карты "params", а четные индексы (2, 4, 6 и т. Д.) - кроме 0 - значения "params" "карта.

Если ваш вектор "токенов" правильный, вы можете сделать что-то вроде этого:

for (int i = 1; i < (tokens.size() - 1); i += 2) {
    std::string& key = block.params[i];
    std::string& value = block.params[i + 1];
    block.params.insert(std::pair<std::string, std::string>(key, value));
}

Использование (tokens.size () - 1) в качестве максимального значения «i» позволяет избежать выброса исключения std :: out_of_range в случае, если вектор «tokens» имеет ключ (по нечетному индексу) ) но без значения (по четному индексу).

Использование метода std :: map :: insert () вставляет новую пару ключ / значение , только если ключ еще не существует на карте. Другой способ вставить пару ключ / значение в карту и переопределить значение, если ключ уже существует , - использовать оператор [] , например, так:

block.params[key] = value;

Дополнительные примечания:

  1. Оптимизация компилятора должна избавить от шага создания ссылок и напрямую передавать векторные значения «токенов» в метод std :: map :: insert (), избегая лишних накладных расходов, создавая бесполезные, но увеличивающиеся ссылки на читаемость. .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...