【发布时间】:2014-08-25 15:11:49
【问题描述】:
我有一个对象,可以通过它的名字来识别,我想放置它在 STL 容器之一中。
class MyClass {
public:
//getters and setters, other functions
private:
std::string name;
//other member variables
};
所以起初我认为 类似地图的结构 的使用与我的情况无关,因为在这些结构中,标识符(键)与类本身。使用映射,我必须返回 name 变量并将其复制到“外部”类(浪费内存和不合逻辑,违反 OOP 规则)。
我的下一个镜头是使用类似集合的结构。在这种情况下,我只有关键字段,我在其中加载整个对象。使用这种方法,我必须重载 和 == 运算符才能使用对象作为键。如果我使用 unordered_set,我什至可以制作一个用于散列的函子,它工作得很好。这里的问题是 我不能像使用地图那样使用容器函数。这是有效的mapInstance.find("example"),而不是setInstance.find("example")。我必须创建一个将成员变量name 设置为“example”的对象并将其传递给find() 函数。这个解决方案的问题是我的类中的其他成员变量是重复且未使用。我什至尝试为std::string 和MyClass 类重载 和== 运算符,如果我像stringInstance < MyClassInstance 这样使用它们,它工作得很好,但是容器函数无法使用(我什至尝试将函子重载到使用没有成功的字符串)。
你能建议我一个简单的方法(或方法),如何用std::set 或std::map(也许是其他人)解决这个问题?
在std::map 中,密钥不能是引用(据我所知),我不知道如何用std::set 解决它。
注意: 将指针存储在map 的关键字段中的问题在于,如果我们改变主意并使用unordered_map 而不是@987654336 @,hash 会根据指针计算,而不是根据字符串计算(hash 函数可以被覆盖,但是对于一个简单的任务来说似乎很复杂)。
感谢您的帮助!
【问题讨论】:
-
你考虑过
find_if而不是find吗? -
至少在C++14中,你应该可以使用
findwithout constructing a key。 -
@Angew,我相信要使其正常工作,您需要确保提供
std::less<>或is_transparent的其他内容,而不是使用默认的std::less。 -
字符串标识符是否必须是动态的和/或字符串?
-
@Angew 我想你刚刚解决了我的问题!你能告诉我一个例子如何在 std::set 上使用它吗?