У меня есть структура то есть:
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/повышения?
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.
Просто примечание: любое решение, использующее список, имеет как минимум 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;
}
// ...
}
}
Подобно Ответ Ника 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;
}
Очевидно, есть много способов сделать это. Мне нравится вкладывать в структуры данных как можно больше интеллекта.