带有uint8_t的C++无序映射
C++ unordered map with uint8_t
我在使用键类型为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);
相关文章:
- 递归无序映射
- c++找不到具有相同哈希的无序集合元素
- 正在将无序映射设置为无序映射的值
- 智能指针作为无序映射键,并通过引用进行比较
- 如何使用set实现无序数据结构?
- 如何写向量的无序向量集,即unordered_set<向量<向量<int>>集合?
- 如何禁用 CPU 的无序执行
- 从C++无序集合中高效提取元素
- 打印无序映射的第二个元素,即集合
- 当我将其插入无序地图时,矢量的容量为 0
- 代码块中无序多集的编译错误17.12
- 由并发无序映射查找线程调用的函数是否安全?
- 如何按值对无序哈希映射进行排序
- gtest 期望无序元素与自定义比较器/匹配器一起使用
- 将大数字(10-12 位数字)存储在无序映射中<字符串,整数>
- 使用无序映射在STL中存储键值对
- 为C++中的无序映射获取给定输入键的错误值
- 如何将一个单词拆分成字母,并将它们放入一个无序的列表/集合中
- 将大型对象存储在无序映射中是否效率低下
- 仅从无序集合中删除一个项目