Qt: Как вычесть два QSet из QString в режиме нечувствительности к регистру - PullRequest
4 голосов
/ 04 мая 2011

Я работаю над логической проблемой, используя Qt.У меня есть два QSets для QString:

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

Я хочу вычесть set1 из set2, поэтому я использую:

set2.subtract( set1 );

И я получаю:

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

Но в этом случае «bbb» не удаляется из set2, хотя set1 содержит эту запись.Это потому, что метод QString :: contains по умолчанию (это метод, используемый QSet :: subtract) чувствителен к регистру.

Существует еще один метод QString :: contains, который принимает параметр для определения режима чувствительности к регистру,но я действительно не понимаю, как я мог бы это использовать.

У кого-нибудь есть идеи, как сделать нечувствительное к регистру вычитание между двумя QSet QString, пожалуйста?

Вот что я имею в видудо сих пор пробовал:

Преобразование обоих наборов в верхний регистр набор2 отображается в списке, поэтому не будет странно, если все элементы в верхнем регистре (или ни в нижнем регистре ни).

Расширение класса QSet и переопределение метода вычитания Я пытался расширить этот класс с помощью пользовательского класса MyStringSet, но мне не очень удобно с Qt, и это кажется мне довольно сложным.

Ответы [ 2 ]

8 голосов
/ 04 мая 2011

Классы контейнеров 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;
}
3 голосов
/ 04 мая 2011

Самый быстрый способ - создать подкласс QString следующим образом и переопределить компараторы, в приведенном ниже примере я сделал оператор равенства:

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