向量到字符串和 C++ 中的 HashMap
Vector to a string and HashMap in C++
我从 vector 开始,unordered_map 在 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”,为什么我不能像这样获取key“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;
在这里,我可以显示"The value of the key '180' : World"。
那么 s1 到底是什么?不是字符串“151”吗?
从std::unordered_map<const void *, const void *>
的角度来看,map1[s1]
和map1["151"]
是不一样的,因为unordered_map
只是比较key和指针的值,而不是指针指向的值。
而在第二段代码中,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;
我从 vector 开始,unordered_map 在 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”,为什么我不能像这样获取key“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;
在这里,我可以显示"The value of the key '180' : World"。
那么 s1 到底是什么?不是字符串“151”吗?
从std::unordered_map<const void *, const void *>
的角度来看,map1[s1]
和map1["151"]
是不一样的,因为unordered_map
只是比较key和指针的值,而不是指针指向的值。
而在第二段代码中,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;