使用uint64_t键类型从map <int,string =“”>返回值

时间:2018-10-10 11:21:42

标签: c++ c++11 stdmap uint64

新手问题,但我进行了搜索,但找不到能明显解决我问题的东西-很抱歉,这很抱歉。

我定义了一张看起来像这样的地图:

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

但是,我需要使用另一个函数提供的testmap值从uint64_t检索值。

当我执行testmap[my_uint64_t_value]时,它返回一个空字符串,所以我认为这是因为它将my_uint64_t_value添加为 key 并设置了 value 转到NULL

如果我将地图类型设置为<uint64_t, string>,至少在当前定义键的方式上,这是相同的。

但是,我有没有办法:

  1. uint64_t的值转换为常规的int
  2. 将地图定义为<uint64_t, string>,并能够定义我的 键是“正确”类型?

int类型转换似乎并不常见,应该避免这种情况吗?

2 个答案:

答案 0 :(得分:3)

得到空字符串的原因是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;

答案 1 :(得分:1)

如另一个答案中所述,如果映射中不存在键,则映射类的[]运算符将使用默认构造的值执行插入。

您可以先使用count方法来确定密钥,然后再访问它。

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

另一种解决方案是使用at方法访问该值。如果密钥不存在,则会插入std::out_of_range异常,而不是插入新密钥。