我有一个对象,它可以通过名称进行识别,我想把它放在其中一个STL容器中。
class MyClass {
public:
//getters and setters, other functions
private:
std::string name;
//other member variables
};
一开始我认为在我的情况下使用类似于map的结构是不相关的,因为在这些结构中,标识符(键)与类本身分离。使用map,我必须返回名称变量并将其“复制”到类之外(浪费内存且不合逻辑,违反了OOP规则)。
我接下来尝试使用类似于集合的结构。在这种情况下,我只有键字段,其中我加载整个对象。使用此方法,我必须重载<、>和==运算符,以便将对象用作键。如果我使用unordered_set,甚至可以制作一个用于哈希的函数对象,它可以正常工作。问题在于我不能像使用map那样使用容器函数。这是有效的
mapInstance.find("example")
,而这不是setInstance.find("example")
。我必须创建一个名为“example”的成员变量设置为“name”的对象并将其传递给find()
函数。该解决方案的问题在于我类中的其他成员变量会被复制但未被使用。我甚至尝试为 std :: string 和 MyClass 类重载<、>和==运算符,如果像这样使用它们stringInstance <MyClassInstance
,则可以正常工作,但容器函数无法使用(我甚至尝试重载functor以适用于字符串但没有成功)。
你能建议我一个简单的方法(或方法),如何用 std :: set 或 std :: map 解决这个问题吗?在 std :: map 中,键不能是引用(据我所知),我不知道如何用 std :: set 解决它。
注意:将指针存储在map的关键字段中的问题在于,如果我们改变主意并使用unordered_map而不是map,则哈希将基于指针而不是基于字符串计算(哈希函数可以被覆盖,但对于一个简单的任务似乎非常复杂)。
谢谢你的帮助!
find_if
而不是find
? - Oliver Charlesworthfind
。 - Angew is no longer proud of SOstd::less<>
或其他具有is_transparent
的内容,而不是使用默认的std::less
。 - chris