首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QSet中的重复

QSet中的重复
EN

Stack Overflow用户
提问于 2010-08-15 21:20:33
回答 4查看 4.4K关注 0票数 2

对于类X和QSet< X* >,如何确保QSet不包含重复元素?X类型的每个对象中唯一的属性是一个QString,可以使用getName()获取该属性。

我实现了qHash(X*)函数、operator==()、operator<()和operator>(),但是QSet仍然接受重复的元素,即同名的元素。

有人能帮我做这件事吗?

好的。这就是我想要做的。我有一个Y类和一个X类,它们都继承了QDialog。Y类(插槽)中的函数负责生成X类的对象。Y的对话框将负责生成X对象。这就是为什么我在Y中创建了一个QSet< X* >成员。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-08-16 07:46:09

问题是您不能像这样重载operator==

代码语言:javascript
复制
bool operator==(X*, X*);

这是因为至少有一个参数必须是类类型的。

既然你说你实现了operator==,我想你应该做了这样的事情:

代码语言:javascript
复制
struct X
{
    bool operator==(X*) const;
};

QSet试图复制时,将永远不会调用此运算符,因为它需要X类型的左参数和类型为X*的右参数。

我可以看到解决这个问题的两种可能的办法:

  • 不将项目存储为指针(即使用QSet<X>)。这将允许您重载正确的运算符。但是,这个解决方案并不总是可行的。
  • 如果您可以以某种方式强制使用一个给定id的对象,您可以只在QSet中存储指针,而不需要重载任何运算符或qHash函数。

编辑:如果您的设计允许使用相同的id创建多个X-objects,但您只希望在任何时候都存在这样的对象,那么最好使用从id映射到X*QMap。创建新对象时,执行如下操作:

代码语言:javascript
复制
QString newId = ...;
delete objectsMap[newId];
objectsMap[newId] = new X(newId);
票数 3
EN

Stack Overflow用户

发布于 2010-08-16 08:48:41

根据您的确切需求,您可以使用排序向量和std::unique (它接受一个自定义二进制谓词进行比较)。

票数 0
EN

Stack Overflow用户

发布于 2010-08-16 15:18:19

你能用QMap代替吗?您的对话框将有成员变量QMap<QString, X*> items。那么检查和创建新的X就像:

代码语言:javascript
复制
QString name = "foo";
if (!items.contains(name))
{
    items[name] = new X(name);
}
else
{
    // "foo" already exists
}

也许这不是像使用QSet那样优雅的解决方案,但我认为这更短,更容易理解。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3489315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档