向量到字符串和C++中的HashMap
Vector to a string and HashMap in C++
我从C++中的向量和无序映射开始。但我不明白通过键访问映射值时出错的原因。
首先,我定义一个整数向量如下:
std::vector <int> vec;
vec.push_back(1);
vec.push_back(5);
vec.push_back(1);
然后我将矢量转换为字符串:
std::ostringstream oss;
if (!vec.empty())
std::copy(vec.begin(), vec.end(),std::ostream_iterator<int>(oss));
std::string s = oss.str();
const void * s1=s.c_str();
然后我创建了我的地图:
std::unordered_map<const void *, const void *> map1;
map1[s1]="Hello";
这里,如果s1等于"151",为什么我不能像这样获得密钥"151"的值"Hello":
std::cout << (char *) map1["151"] << std::endl;
与此不同:
const char* s2 = "180"
map1[s2]="World"
std::cout <<"The value of the key '180' :" << (char *) map1["180"] << std::endl;
在这里,我可以显示"键‘180’的值:世界"。
那么s1到底是什么呢?这不是字符串"151"吗?
从std::unordered_map<const void *, const void *>
的角度来看,map1[s1]
与map1["151"]
不同,因为unordered_map
只是根据指针的值而不是指针指向的值来比较键。
在第二段代码中,s2
指向文字c样式字符串"180"
,因此map1[s2]
和map1["180"]
可以获得相同的值,因为它们指向相同的东西。
根据std::unordered_map、的声明
template<
class Key,
class T,
class Hash = std::hash<Key>,
class KeyEqual = std::equal_to<Key>,
class Allocator = std::allocator< std::pair<const Key, T> >
> class unordered_map;
std::unordered_map
使用std::equal_to作为其默认的键比较器,它只使用operator==
进行比较。
你可以为std::unordered_map
提供自己的比较器来改变行为,比如
std::unordered_map<const void*, const void*, std::hash<const void*>, my_comparer> map1;
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- .cpp和.h文件中的模板专用化声明
- 反向给定链表中的K节点
- 正在查找文档以获得PS4平台的C++中的设备信息
- enum是C++中的宏变量还是整数变量
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 将字符串存储在c++中的稳定内存中
- 文本文件中的单词链表
- 递归函数计算序列中的平方和(并输出过程)
- 如何从C++中的依赖类型中获得它所依赖的类型
- C++中的"inline"关键字
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 用C++中的一个变量定义一个常量
- vector.resize()中的分配错误
- 在C 中的自定义类的hashmap中的默认值
- 如何使用C++中的Hashmap在任意随机数组中找到所有求和为特定值的对
- 向量到字符串和C++中的HashMap
- c++中的Hashmap不排序元素
- C++中简单的hashmap实现