Zuerst sollten Sie nicht QList
sondern QVector
verwenden, da es in den meisten Fällen mehr efficient ist. Es sei denn, Sie benötigen QList
, weil Sie mit der Qt API, die es natürlich erwartet, interagieren. Auch dann wäre QVector::toList
wahrscheinlich besser.
QVector<Data> data{{"F1", "Id1", "Pass"}, //or QList<Data> if you really insist...
{"F1", "Id1", "Pass"},
{"F1", "Id1", "Pass"},
{"F1", "Id2", "Fail"},
{"F1", "Id2", "Fail"},
{"F3", "Id3", "Pass"},
{"F3", "Id3", "Pass"},
{"F2", "Id4", "Pass"},
{"F2", "Id4", "Pass"}};
qDebug() << std::count_if(data.cbegin(),
data.cend(),
[](const Data &data) { return data.Feature == "F1" && data.Result == "Pass"; });
Druck 3.
Benötigt C++ 11 für das Lambda aber count_if
selbst nicht:
Wie für Ihr Problem, kann es auch one-liner in C++ sein.
Um alle eindeutigen IDs auflisten, die die Bedingung erfüllen, es noch ein Einzeiler sein könnte, aber es beginnt chaotisch zu bekommen:
QVector<Data> result;
std::copy_if(data.cbegin(),
data.cend(),
std::back_inserter(result),
[&result](const Data &data)
{
return std::find_if(result.cbegin(), result.cend(), [&data](const Data &d) { return d.Id == data.Id; }) == result.cend()
&& data.Feature == "F1"
&& data.Result == "Pass";
});
qDebug() << result.count();
Haben Sie die Anzahl der „id“ Werte brauchen, die den Kriterien entsprechen, oder Wie oft kommt jede ID in den Matches vor? I.e. brauchen Sie die Ausgabe, um '1' zu sein (nur Id1 entspricht den Kriterien) oder eine Karte wie' [Id1 -> 3] '(Id1 entspricht den Kriterien 3 mal) –