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

Vector to a string and HashMap in C++

本文关键字:中的 HashMap C++ 字符串 向量      更新时间:2023-10-16

我从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;