c++ - C++ 中的 vector 到字符串和 HashMap

标签 c++ vector unordered-map

我从 C++ 中的 vector 和 unordered_map 开始。但我不明白通过键访问 map 的值时出现错误的原因。

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

std::vector <int> vec;
vec.push_back(1);
vec.push_back(5);
vec.push_back(1);

然后我将 vector 转换为字符串:

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();

我创建了我的 map :

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;

在这里,我可以显示“The value of the key '180' : World”。

那么 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;

关于c++ - C++ 中的 vector 到字符串和 HashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33433704/

相关文章:

c++ - 为什么有些库使用非常量 char * 作为函数参数?

c++ - 运行时多态性中的构造函数行为

c++ - 从第 n 个元素开始迭代 vector

c++ - 两个 unordered_maps 的交集

c++ - 为什么在使用 QList 时 std::sort 会崩溃?

c++ - 类型向量化的适当通用习惯用法?

C++ vector 不保留从循环接收的值

c++ - 调整类中二维 vector 的大小

c++ - 分配时 unordered_map 更改的顺序

c++ - 带有initializer_list和size的std::unordered_map构造函数在main中编译,但不在类定义中编译