4

Qtを使用して論理的な問題に取り組んでいます。QString の 2 つの QSet があります。

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

set2 から set1 を減算したいので、次を使用します。

set2.subtract( set1 );

そして、私は得ます:

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

ただし、この場合、set1 にはこのレコードが含まれていますが、「bbb」は set2 から削除されません。これは、デフォルトの QString::contains メソッド (QSet::subtract で使用されるメソッド) が大文字と小文字を区別するためです。

大文字と小文字の区別モードを定義するパラメーターを取る別の QString::contains メソッドがありますが、それをどのように使用できるかはわかりません。

QStringの2つのQSet間で大文字と小文字を区別しない減算を行う方法を知っている人はいますか?

これが私がこれまでに試したことです:

両方のセットを大文字に変換set2 はリストに表示されるため、すべての項目が大文字 (または小文字以外) の場合は見栄えがよくありません。

QSet クラスを拡張し、減算メソッドをオーバーライドする このクラスを MyStringSet カスタム クラスで拡張しようとしましたが、Qt にあまり慣れておらず、非常に複雑に思えます。

4

2 に答える 2

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;
}
于 2011-05-04T14:42:42.217 に答える
3

最も簡単な方法は、このように QString をサブクラス化し、コンパレーターをオーバーライドすることです。以下の例では、等値演算子を実行しています。

  class QStringInsensitive: public QString
  {
     bool operator==(const QString& other) const
     {
        return (0 == this->compare(other, Qt::CaseInsensitive));
     }
  };
  QSet< QStringInsensitive > set;
于 2011-05-04T14:20:56.050 に答える