向量到字符串和C ++中的HashMap

用户名

我从C ++中的vector和unordered_map开始。但是我不了解通过键访问映射值时错误的原因。

首先,我定义一个整数向量,如下所示:

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”?

songyuanyao

从a的角度来看std::unordered_map<const void *, const void *>map1[s1]与有所不同map1["151"],因为unordered_map仅将键与指针的值进行比较,而不是将指针所指向的值进行比较。

在第二个代码中,s2指向文字c样式的字符串"180",因此map1[s2]andmap1["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;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章