带有uint8_t的C ++ unordered_map

时间:2014-04-14 18:51:08

标签: c++ stl unordered-map

我使用密钥类型为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

3 个答案:

答案 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);