Прежде всего, вы не должны использовать QList
, а скорее QVector
, так как это больше efficient в большинстве случаев. Если вам не нужен QList
, потому что вы взаимодействуете с Qt API, который его ожидает, конечно. Даже тогда, хотя QVector::toList
, вероятно, было бы лучше.
Что касается вашей проблемы, это может быть один вкладыш в C++, а также:
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"; });
Печать 3.
Требуется C++ 11 для лямбда, но count_if
сам не делает.
Чтобы перечислить все уникальные идентификаторы, которые удовлетворяют условию она все еще может быть один вкладыш, но она начинает запутаться:
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();
вам нужно число значений «ID», которые соответствуют критериям, или делать как часто каждый идентификатор встречается в матчах? I.e. вам нужен вывод '1' (только Id1 соответствует критериям) или карту типа' [Id1 -> 3] '(Id1 соответствует критериям 3 раза) –