【问题标题】:C++ unordered map with uint8_t [duplicate]带有uint8_t的C ++ unordered_map [重复]
【发布时间】:2014-04-14 18:51:08
【问题描述】:

我在使用键类型 uint64_t 和值类型 uint8_t 的 unordered_map 时遇到了一个奇怪的问题。 (我有几个可能很大的整数,我想用 uint8_t 值来计算。)这里有一些代码:

std::unordered_map<uint64_t,uint8_t> mymap;
mymap.emplace(2,1);
mymap.emplace(20,3);
mymap.emplace(200,34);

for (auto it = mymap.begin(); it != mymap.end(); ++it) {
    std::cout << it->first << ":" << it->second << std::endl;
    printf("%lld : %d\n", it->first, it->second);
}

看来键和值在unordered_map 中保存得很好。但是,std::cout &lt;&lt; it-&gt;second &lt;&lt; std::endl; 代码混淆了uint8_t 值的输出。也就是说,cout(for 循环中的第一行)会使输出出现乱码,而老式的 cstdio printf(for 循环中的第二行)可以很好地打印出这些值。诡异的。知道这里发生了什么吗?

如果我将unordered_map 更改为&lt;uint64_t,uint16_t&gt;&lt;uint64_t,int&gt;,它工作得非常好。我尝试了各种终端和伪终端环境以及文本文件,所有uint8_ts 的输出都出现乱码或缺失。我被难住了。

这是输出:

20:
20 : 3
200:"
200 : 34
2:
2 : 1

【问题讨论】:

  • 要添加一两个乱码对吗?
  • 提示:uint8_t 的 typedef 是什么?

标签: c++ stl unordered-map


【解决方案1】:

注意:iostream 库中没有采用有符号或无符号字符的格式化输入函数。因此 uint8_t 被转换并解释为字符。

std::cout &lt;&lt; it-&gt;first &lt;&lt; ":" &lt;&lt; ùnsigned(it-&gt;second) &lt;&lt; std::endl; 会修复它。

【讨论】:

    【解决方案2】:

    你可以做演员:

    std::cout << int(it->second);
    

    【讨论】:

      【解决方案3】:

      似乎uint8_t 类型是unsigned char 类型的别名。如果您将值转换为 unsigned int,您将获得与 printf 相同的结果。

      for (auto it = mymap.begin(); it != mymap.end(); ++it) {
          std::cout << it->first << ":" << ( unsigned int )it->second << std::endl;
          printf("%lld : %d\n", it->first, it->second);
      }
      

      至于您的原始代码,uint8_t 使用了以下运算符

      template<class traits>
      basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&,
      unsigned char);
      

      【讨论】:

        猜你喜欢
        • 2021-06-21
        • 2013-08-30
        • 2014-10-01
        • 2018-05-29
        • 1970-01-01
        • 2013-03-06
        • 1970-01-01
        • 2013-11-05
        • 1970-01-01
        相关资源
        最近更新 更多