簡體   English   中英

Qt:如何在不區分大小寫模式下減去 QString 的兩個 QSet

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

我正在使用 Qt 解決一個邏輯問題。 我有兩個 QString 的 QSet:

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 顯示在一個列表中,因此如果所有項目都為大寫(或都不為小寫),這並不奇怪。

Extend QSet class and override subtract method I've tried to extend this class with a MyStringSet custom class, but I'm not very comfortable with Qt and this appears to me quite complicated.

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM