QList迭代使用条件

时间:2017-01-03 07:25:55

标签: c++ qt

我是Qt的新手。我怀疑如何有条件地迭代QList

struct Data
{
    QString Feature;
    QString Id;
    QString Result;
};

QList<Data> myList;

我有这样的清单:

List Preview

我想获取列表中Feature="F1"Result="pass"的项目 我需要在功能1中获取ID计数。删除重复项。

我熟悉LINQ和C#List,并且可以在C#的单行代码中实现。但是对于QList我有点困惑。

1 个答案:

答案 0 :(得分:1)

首先,您不应该使用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。

lambda需要C ++ 11,但count_if本身不需要。

要列出满足条件的所有唯一ID,它仍然可以是单行,但它开始变得混乱:

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();