QT и нахождение частичных соответствий в QList

У меня есть структура то есть:

struct NameKey
{
    std::string      fullName;
    std::string      probeName;
    std::string      format;
    std::string      source;
}

которые сохранены в QList:

QList<NameKey> keyList;

то, что я должен сделать, является находкой происшествие в keyList частичного соответствия, где поиск для NameKey, который только имеет двух заполненных участников. Всеми keyList записями является полный NameKey.

Моя текущая реализация является, ну, в общем, скучной в экстремальном значении со слишком многими if's и условия.

Так, Если у меня есть DataKey с fullName и форматом, я должен найти все происшествия в keyList, которые соответствуют. Какие-либо полезные доступные вещи QT/повышения?

8
задан ExpatEgghead 7 June 2010 в 13:51
поделиться

3 ответа

QList совместим с STL. Таким образом, вы можете использовать его с алгоритмом STL:

struct NameKeyMatch {
    NameKeyMatch(const std::string & s1, const std::string & s2, const std::string & s3, const std::string & s4)
    : fullName(s1), probeName(s2), format(s3), source(s4) {}

    bool operator()(const NameKey & x) const
    {
        return  fullName.size() && x.fullName == fullName &&
                probeName.size && x.probeName == probeName &&
                format.size && x.format == format &&
                source.size && x.source == source;
    }

    std::string fullName;
    std::string probeName;
    std::string format;
    std::string source;
};

QList<int>::iterator i = std::find_if(keyList.begin(), keyList.end(), NameKeyMatch("Full Name", "", "Format", ""));

Я не знаю, будет ли Qt активно поддерживать совместимость с STL.

6
ответ дан 5 December 2019 в 17:34
поделиться

Просто примечание: любое решение, использующее список, имеет как минимум O (n) временную сложность.

Один из вариантов - использовать QString вместо std :: string и воспользоваться преимуществами встроенной поддержки регулярных выражений.

Пример:

#include <QList>
#include <QString>
#include <QRegExp>

struct NameKey
{
    QString    fullName;
    QString    probeName;
    QString    format;
    QString    source;
};

QList<NameKey>  keyList; // <--

void Foo() {
   QRegExp  reg("pattern"); // <-- prepare a regular expression (format)
   NameKey  nk;
   foreach (nk, keyList) {
      if (nk.fullName.contains(reg)) {
         // a match ...
         break;
      }
      // ...
   }
}
4
ответ дан 5 December 2019 в 17:34
поделиться

Подобно Ответ Ника D :

#include <QList>
#include <QString>
#include <QRegExp>

struct NameKey
{
    QString    fullName;
    QString    probeName;
    QString    format;
    QString    source;

    bool containsPattern(const QRegExp &pattern) {
       return fullName.contains(reg) ||
              probeName.contains(reg) ||
              format.contains(reg) ||
              source.contains(reg);
    }
};

QList<NameKey> matches(const QList<NameKey> &keyList, const QString &pattern) {
   QRegExp  reg(pattern);
   QList<NameKey> matches;
   foreach (NameKey nk, keyList) {
      if (nk.containsPattern(reg))
         matches << nk;
   }
   return matches;
}

Очевидно, есть много способов сделать это. Мне нравится вкладывать в структуры данных как можно больше интеллекта.

0
ответ дан 5 December 2019 в 17:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: