gpt4 book ai didi

c++ - 访问 unordered_set 中的自定义对象

转载 作者:行者123 更新时间:2023-11-30 03:43:29 26 4
gpt4 key购买 nike

请帮助弄清楚将 unordered_set 与自定义结构一起使用的逻辑。考虑我有以下类(class)

struct MyClass {
int id;
// other members
};

与 shared_ptr 一起使用

using CPtr = std::shared_ptr<MyClass>;

因为通过键快速访问我应该使用带有自定义哈希的 unordered_set 和 MyClass::id 成员作为键):

template <class T> struct CHash;
template<> struct CHash<CPtr>
{
std::size_t operator() (const CPtr& c) const
{
return std::hash<decltype(c->id)> {} (c->id);
}
};
using std::unordered_set<CPtr, CHash>;

目前,unordered_set 似乎仍然是一个合适的容器。然而,集合的标准 find() 函数被假定为 const 以确保键不会被更改。我打算更改保证保持 key 不变的对象。所以,问题是:

1) 如何通过 int key 保留更改元素的可能性来实现对集合元素的轻松访问,例如

auto element = my_set.find(5);
element->b = 3.3;

可以添加转换构造函数并使用类似的东西

auto element = my_set.find(MyClass (5));

但它并没有解决constness 的问题,如果类很大怎么办。

2) 我真的走错路了吗?我应该使用另一个容器吗?例如 unordered_map,它将为每个消耗更多内存的条目多存储一个 int 键。

最佳答案

指针不会将其常量性转换到它所指向的对象上。意思是,如果您经常引用 std::shared_ptr (在集合中)您仍然可以通过此指针修改对象。这是否是您应该做的事情是一个不同的问题,它不能解决您的查找问题。

当然,如果你想通过键查找一个值,那么这就是std::unordered_map专为所以我会仔细看看那里。我看到这种方法的主要问题不是太多的内存开销( unordered_setunordered_map 以及 shared_ptr 无论如何都有明显的内存开销),而是你必须维护冗余信息( id 在对象和 id 作为键)。

如果你没有太多的插入并且你绝对不需要(平均)恒定的查找时间并且内存开销对你来说真的很重要,你可以考虑第三种解决方案(除了使用第三方或自己编写的数据类(class)结构):即围绕已排序的 std::vector<std::shared_ptr<MyClass>> 编写一个薄的包装器或者 - 如果合适 - 甚至更好 std::vector<std::unique_ptr<MyClass>>使用 std::upper_bound用于查找。

关于c++ - 访问 unordered_set 中的自定义对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36055416/

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