c – 将STL容器与包含其自己的键的类一起使用

我有一个对象,可以通过其名称来识别,我想将它放在一个STL容器中.

class MyClass {
public:
    //getters and setters, other functions
private:
    std::string name;
    //other member variables
};

所以起初我认为在我的情况下使用类似地图的结构是无关紧要的,因为在这些结构中,标识符(键)与类本身是分开的.使用map我必须返回name变量并将其复制到“class”之外(浪费内存和不合逻辑,打破OOP规则).

我的下一个镜头是使用类似集合的结构.在这种情况下,我只有关键字段,我加载整个对象.使用这种方法我必须重载我的<,>和==运算符,以便将对象用作键.如果我使用unordered_set,我甚至可以为散列创建一个仿函数,它工作得很好.这里的问题是我不能像使用地图一样使用容器功能.这是有效的mapInstance.find(“example”),这不是setInstance.find(“example”).我必须创建一个成员变量名设置为“example”的对象,并将其传递给find()函数.这个解决方案的问题是我的类中的其他成员变量是重复的而不是使用.我甚至尝试重载<,>和==运算符的std :: string和MyClass类,如果我使用它们就像这样的stringInstance< MyClassInstance,但是容器函数是不可用的(我甚至尝试重载函数来使用字符串而没有成功). 你能建议我一个简单的方法(或方法),如何用std :: set或std :: map(也许是其他人)来解决这个问题?
在std :: map中,键不能作为引用(我知道),我不知道如何使用std :: set来解决它.

注意:将指针存储在地图的关键字段中的问题是,如果我们改变主意并使用unordered_map而不是map,则将根据指针计算散列,而不是基于字符串(散列函数可以被覆盖,但对于一个简单的任务来说似乎很复杂).

谢谢你的帮助!

最佳答案 您应该问问自己对容器的要求是什么.

需要考虑的事项是:

>容器中通常有多少个对象
>什么是内存限制
>搜索对象的频率和可接受的复杂程度是多少?

std :: map有一些可能与你的类冲突的要求.例如.将元素添加到地图后,不允许更改密钥.但是,您的班级可能每次都更改名称.从这个考虑,应该清楚的是std :: map不能使用对字符串的引用作为键.

在最简单的情况下,您可以考虑使用带有谓词的std::liststd::find_if来检查特殊名称.这将具有O(n)复杂性.

点赞