I have a struct viz:
struct NameKey
{
std::string fullName;
std::string probeName;
std::string format;
std::string source;
}
which are held in a QList:
QList<NameKey> keyList;
what I need to do is find an occurence in keyList of a partial match 开发者_C百科where the search is for a NameKey that only has two members filled. All the keyList entries are full NameKey's.
My current implementation is , well, boring in the extreme with too many if's and conditions.
So, If I have a DataKey with a fullName and a format I need to find all the occurences in keyList which match. Any useful Qt/boost things available?
QList
is compatible with STL. So you can use it with STL algorithm:
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", ""));
I don't know if Qt will actively maintain STL compatibility though.
Just a note: any solution that uses a list has O(n) time complexity, at least.
One option is to use QString
, instead of std::string
, and take advantage of their regular expressions built-in support.
Example:
#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;
}
// ...
}
}
Similar to Nick D's answer:
#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;
}
There are obviously many ways to do this. I like to put as much intelligence into data structures as possible.
精彩评论