gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:38:02 40 4
gpt4 key购买 nike

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

在这里,我可以显示“键‘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作为它的默认 key 比较器,它只使用 operator==用于比较。

您可以为 std::unordered_map 提供自己的比较器改变行为,比如

std::unordered_map<const void*, const void*, std::hash<const void*>, my_comparer> map1;

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

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com