对于类X和QSet< X* >,如何确保QSet不包含重复元素?X类型的每个对象中唯一的属性是一个QString,可以使用getName()获取该属性。
我实现了qHash(X*)函数、operator==()、operator<()和operator>(),但是QSet仍然接受重复的元素,即同名的元素。
有人能帮我做这件事吗?
好的。这就是我想要做的。我有一个Y类和一个X类,它们都继承了QDialog。Y类(插槽)中的函数负责生成X类的对象。Y的对话框将负责生成X对象。这就是为什么我在Y中创建了一个QSet< X* >成员。
发布于 2010-08-16 07:46:09
问题是您不能像这样重载operator==:
bool operator==(X*, X*);这是因为至少有一个参数必须是类类型的。
既然你说你实现了operator==,我想你应该做了这样的事情:
struct X
{
bool operator==(X*) const;
};当QSet试图复制时,将永远不会调用此运算符,因为它需要X类型的左参数和类型为X*的右参数。
我可以看到解决这个问题的两种可能的办法:
QSet<X>)。这将允许您重载正确的运算符。但是,这个解决方案并不总是可行的。QSet中存储指针,而不需要重载任何运算符或qHash函数。编辑:如果您的设计允许使用相同的id创建多个X-objects,但您只希望在任何时候都存在这样的对象,那么最好使用从id映射到X*的QMap。创建新对象时,执行如下操作:
QString newId = ...;
delete objectsMap[newId];
objectsMap[newId] = new X(newId);发布于 2010-08-16 08:48:41
根据您的确切需求,您可以使用排序向量和std::unique (它接受一个自定义二进制谓词进行比较)。
发布于 2010-08-16 15:18:19
你能用QMap代替吗?您的对话框将有成员变量QMap<QString, X*> items。那么检查和创建新的X就像:
QString name = "foo";
if (!items.contains(name))
{
items[name] = new X(name);
}
else
{
// "foo" already exists
}也许这不是像使用QSet那样优雅的解决方案,但我认为这更短,更容易理解。
https://stackoverflow.com/questions/3489315
复制相似问题