我使用密钥类型为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 << it->second << std::endl;
代码正在混淆uint8_t
值的输出。也就是说,cout
(for循环中的第一行)使输出变得混乱,而旧学校cstdio printf
(for循环中的第二行)打印出的值就好了。奇怪的。知道这里发生了什么吗?
如果我将unordered_map
更改为<uint64_t,uint16_t>
或<uint64_t,int>
,则效果非常好。我尝试了各种终端和伪终端环境以及文本文件,所有这些都有uint8_t
的乱码或缺失输出。我很难过。
这是输出:
20:
20 : 3
200:"
200 : 34
2:
2 : 1
答案 0 :(得分:2)
注意:在iostream库中没有采用带符号或无符号字符的格式化输入函数。因此,uint8_t被转换并解释为字符。
std::cout << it->first << ":" << ùnsigned(it->second) << std::endl;
会修复它。
答案 1 :(得分:0)
你可以做演员:
std::cout << int(it->second);
答案 2 :(得分:0)
类型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);