2011-05-04 52 views
3

我正在使用Qt來處理邏輯問題。 的QString的,我有兩個QSets:Qt:如何在不區分大小寫模式下減去兩個QString的QSet

QSet<QString> set1: [ "aaa", "BBB" ] 
QSet<QString> set2: [ "aaa", "bbb", "ccc", "ddd" ] 

我想減去集2集1,所以我用:

set2.subtract(set1); 

我獲得:

set2: ["bbb", "ccc", "ddd"] 

但在那情況「bbb」不會從set2中刪除,儘管set1包含此記錄。 這是因爲默認的QString :: contains方法(它是QSet :: subtract使用的方法)區分大小寫。

還有另一個QString :: contains方法,它需要一個參數來定義大小寫敏感模式,但我真的不知道如何使用它。

有沒有人有一個想法如何使QString的兩個QSet之間不區分大小寫的減法?

這裏是我試過到目前爲止:

大寫的變換兩套 SET2顯示在列表中,因此,如果所有的項目都是大寫(或小寫既不),它不會被看中。

擴展QSet類並覆蓋減法我試着用MyStringSet自定義類來擴展這個類,但是我對Qt不是很滿意,這在我看來很複雜。

回答

3

的最快方法是子類的QString這樣並覆蓋比較,在下面的例子中我已經做了等於運算符:

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

謝謝,我說我不是使用Qt相當舒適。使用您的解決方案,我無法在QSet 中插入任何QString。所以我想我需要保持我的QSet ,但我應該將我的QString轉換爲QStringInsensitive。 – Gildas 2011-05-04 15:49:48

+0

你覺得呢?因爲,我不知道我是否必須創建一個QStringInsensitive(const QString&)構造函數或投射。 – Gildas 2011-05-04 15:55:26

+0

嗨,我試過這個解決方案不成功: QString * entry; QStringInsensitive * entryInsensitive = qobject_cast (entry); 我得到這個錯誤: 呼叫爲「qobject_cast(QString的*)」 我無法找到互聯網上的任何實例,或在doc,沒有匹配的功能,使這個演員。 這裏可能需要一些幫助:) – Gildas 2011-05-05 08:01:10

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