gpt4 book ai didi

c++ - 在 unordered_map 中使用 string_view 作为键的安全方法

转载 作者:行者123 更新时间:2023-12-05 09:03:40 30 4
gpt4 key购买 nike

我的类型 Val 包含 std::string thekey。

struct Val
{
std::string thekey;
float somedata;
}

我想把我的类型放在一个无序的映射中,以键为键。出于内存和避免转换的原因,我希望将 std::string_view 作为键类型。是否可以在使用 unique_ptr 时创建指向 val.thekey 的 key ?

std::unique_ptr<Val> valptr = ...;
std::unordered_map<std::string_view,std::unique_ptr<Val>> themap;
themap[std::string_view(valptr->thekey)] = std::move(valptr); // is this ok and safe?

最佳答案

Safe way to use string_view as key in unordered map

一般没有,因为 View 下的存储可能随时更改,从而使您的 map 不变量失效。

关联容器通常拥有一个const键正是为了避免这种情况。

在您的特定情况下,使用 std::unordered_set<Val, ValKeyHash, ValKeyEqual> 更有意义具有合适的散列和相等仿函数。


编辑,这些合适的仿函数就是

struct ValKeyHash {
std::size_t operator() (Val const &v)
{
return std::hash<std::string>{}(v.thekey);
}
};

struct ValKeyEqual {
bool operator() (Val const& a, Val const& b)
{
return a.thekey == b.thekey;
}
};

显然,这让我们有点不满意使用临时 Val{key, dummy_data} 的要求对于查找,至少在我们可以在其他答案中使用 C++20 透明/投影版本之前。

关于c++ - 在 unordered_map 中使用 string_view 作为键的安全方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69678864/

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