【问题标题】:How to return a value from std::map<int, std::string> with a uint64_t key type?如何使用 uint64_t 键类型从 std::map<int, std::string> 返回值?
【发布时间】:2019-03-15 07:09:17
【问题描述】:

新手问题,但我对此进行了搜索,但找不到明确解决我问题的方法 - 如果这很明显,请道歉。

我定义了一个如下所示的地图:

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

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

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

如果我将映射类型设置为&lt;uint64_t, string&gt;,这也是一样的,至少我当前定义键的方式是这样。

但是,有没有办法让我:

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

看来int 类型转换并不常见,这是应该避免的吗?

【问题讨论】:

  • 您应该提供完整的源代码示例。我们没有足够的信息来真正确定问题所在。我假设根本没有值为my_uint64_t_value 的键。
  • 关于整数转换:打开编译器警告以警告危险转换。当然,从较大的类型转换为较小的类型时,您必须始终注意可能的溢出,以及在有符号和无符号整数值之间转换时的更多问题。
  • 测试,但你必须知道它很危险,阅读有关 int 范围等的信息。 testmap[static_cast(my_uin64_t_value)]
  • 在这个例子中,它是否像预期的那样工作? cpp.sh/7p3k5 注意 jamek 写的内容,为了测试它可能没问题,但是当你使用可能很快超过地图中 int 的严重数据执行此操作时,你最终会得到一些有趣的行为程序。

标签: c++ c++11 c++17 key-value stdmap


【解决方案1】:

你得到一个空字符串的原因是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"; }

就像 cmets 中提到的 @Rene 一样,从 uint64_t 转换为 int 会导致溢出。因此,将密钥设置为更大的类型(根据要求)将是一个好主意。

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

【讨论】:

    【解决方案2】:

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

    在访问之前,您可以先使用count 方法确定该键是否存在于地图中。

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

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

    【讨论】:

    • map::find 允许使用一个查找来替代at
    猜你喜欢
    • 2010-12-23
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    相关资源
    最近更新 更多