带有uint8_t的C++无序映射

C++ unordered map with uint8_t

本文关键字:C++ 无序 映射 uint8 带有      更新时间:2023-10-16

我在使用键类型为uint64_t、值类型为uint8_t的无序映射时遇到了一个奇怪的问题。(我有几个潜在的大整数,我想用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 : %dn", 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 s的乱码或丢失输出。我被难住了。

这是输出:

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

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

std::cout << it->first << ":" << ùnsigned(it->second) << std::endl;会修复它。

您可以执行强制转换:

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

类型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 : %dn", it->first, it->second);
}

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

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