Как вернуть значение из std :: mapс типом ключа uint64_t? - PullRequest
0 голосов
/ 10 октября 2018

Вопрос новичка, но я искал это и не мог найти что-то, что четко решало бы мою проблему - извинения, если это очевидно.

Я определил карту, которая выглядит так:

map<int, string> testmap = {
    { 0, "a" },
    { 1, "b" },
    { 2, "c" }
}

Однако мне нужно извлечь значение из testmap, используя значение uint64_t, предоставленное другой функцией.

Когда я делаю testmap[my_uint64_t_value], он возвращает пустую строку, так что я думаю, что это потому, чтоон добавляет my_uint64_t_value как ключ и устанавливает значение в NULL.

Это то же самое, если я устанавливаю тип карты в <uint64_t, string>,по крайней мере, так, как я сейчас определяю свои ключи.

Однако есть ли способ, которым я либо:

  1. преобразую значение uint64_t в обычное int
  2. определить карту как <uint64_t, string> и иметь возможность определить мои ключи как 'правильный' тип?

Кажется, что int преобразование типов не так распространено,это то, что следует избегать?

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Как сказано в другом ответе, оператор [] класса карты выполнит вставку с созданным по умолчанию значением, если ключ отсутствует на карте.

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

if(testmap.count(keyToFind))
    return testmap[keyToFind];
else
    report_key_not_found();

Альтернативное решение - использовать at метод для доступа к значению.Он выдаст исключение std::out_of_range, если ключ отсутствует, вместо вставки нового ключа.

0 голосов
/ 10 октября 2018

Причиной получения пустой строки является std :: map :: operator [] возвращает ссылку на значение тогда и только тогда, когда оно существует , в противном случае выполняется вставка .Я подозреваю, что у вас есть последний случай.

Вам нужно использовать std :: map :: find для поиска.

uint64_t keyToFind =  1;
if (auto iter = testmap.find(keyToFind); iter != testmap.cend()) 
{
   // do something
   std::cout << "Found!\n";
}
else { std::cout << "Not Found!\n"; }

Как @Rene, упомянутый в комментарияхприведение от uint64_t к int может вызвать переполнение.Поэтому было бы неплохо создать ключ для шрифта большего размера (согласно требованию).

std::map<uint64_t, std::string> testmap;
...