Qt:如何在大小写不敏感模式下减去QString的两个QSet

Qt: How to subtract two QSet of QString in case insensitivity mode

本文关键字:QString QSet 两个 大小写 模式 Qt      更新时间:2023-10-16

我正在使用Qt处理一个逻辑问题。我有两个qset的QString

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类并重写subtract方法我试图用MyStringSet自定义类扩展这个类,但我对Qt不是很满意,这对我来说很复杂。

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;
}

最快的方法是像这样子类化QString并覆盖比较器,在下面的示例中,我已经完成了相等操作符:

  class QStringInsensitive: public QString
  {
     bool operator==(const QString& other) const
     {
        return (0 == this->compare(other, Qt::CaseInsensitive));
     }
  };
  QSet< QStringInsensitive > set;