【发布时间】:2021-10-22 14:44:13
【问题描述】:
我的类型 Val 包含 std::string thekey。
struct Val
{
std::string thekey;
float somedata;
}
我想把我的类型放在一个无序的映射中,以 key 作为 key。出于内存和避免转换的原因,我希望将 std::string_view 作为键类型。是否可以在使用 unique_ptr 时创建指向 val.thekey 的密钥?
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?
【问题讨论】:
-
这似乎是不需要的。如果您使用
unordered_set,您可以创建自己的哈希器和比较器,只使用thekey,然后您可以节省拥有string_view的成本。 -
themap[std::string_view(valptr->thekey)] = std::move(valptr);如果密钥已经在地图中,则将不安全(旧的 std::string_view 将保留而旧的 Val 被破坏),除此之外,如果你'非常小心 - see other question -
Demo @Turtlefight 所描述的事情
-
@NathanOliver 这将解决内存部分,很好。第二部分:由于需要对输入键进行类型转换,我担心 map.find(aStringView) 会很慢。在我的情况下,我正在搜索的键是 string_view。
-
使用繁琐易出错