我正在使用Qt解决逻辑问题。 我有两个QString的QSets:
QSet<QString> set1: [ "aaa", "BBB" ]
QSet<QString> set2: [ "aaa", "bbb", "ccc", "ddd" ]
我想从set2中减去set1,所以我使用:
set2.subtract( set1 );
我获得了:
set2: ["bbb", "ccc", "ddd"]
但在这种情况下,“bbb”不会从set2中删除,尽管set1包含此记录。 那是因为默认的QString :: contains方法(它是QSet :: subtract使用的方法)区分大小写。
还有另一个QString :: contains方法,它接受一个参数来定义区分大小写模式,但我真的不知道如何使用它。
有人知道如何在QString的两个QSet之间进行不区分大小写的减法吗?
这是我到目前为止所尝试的内容:
以大写字母 set2转换两个集合显示在一个列表中,因此如果所有项目都是大写(或者都不是小写),则不会很花哨。
扩展QSet类并覆盖减法方法我试图用MyStringSet自定义类来扩展这个类,但我对Qt不太满意,这在我看来相当复杂。
答案 0 :(得分:8)
Qt容器类与STL基本兼容。并且std :: set_difference允许指定比较器。当您在某些情况下仅需要不区分大小写或者不想混淆派生标准类型时,这非常有用:
struct qstring_compare_i
{
bool operator()(const QString & x, const QString y) const
{ return QString::compare(x, y, Qt::CaseInsensitive) < 0; }
};
static QSet<QString> substract_sets(const QSet<QString> & qs1, const QSet<QString> & qs2)
{
std::set<QString> r;
std::set_difference(qs1.begin(), qs1.end(), qs2.begin(), qs2.end(), std::inserter(r, r.end()), qstring_compare_i());
QSet<QString> result;
for(std::set<QString>::iterator i=r.begin();i!=r.end();++i) {
result << *i;
}
return result;
}
答案 1 :(得分:3)
最快的方法是像这样对QString进行子类化并覆盖比较器,在下面的示例中我已经完成了相等运算符:
class QStringInsensitive: public QString
{
bool operator==(const QString& other) const
{
return (0 == this->compare(other, Qt::CaseInsensitive));
}
};
QSet< QStringInsensitive > set;