新手问题,但我进行了搜索,但找不到能明显解决我问题的东西-很抱歉,这很抱歉。
我定义了一张看起来像这样的地图:
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>
,至少在当前定义键的方式上,这是相同的。
但是,我有没有办法:
uint64_t
的值转换为常规的int
<uint64_t, string>
,并能够定义我的
键是“正确”类型? int
类型转换似乎并不常见,应该避免这种情况吗?
答案 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
异常,而不是插入新密钥。