2017-01-03 108 views
0

我是Qt的新手。我懷疑如何有條件地迭代QListQList迭代使用條件

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

QList<Data> myList; 

和我有列表這樣的:

List Preview

我想要得到的名單,其中Feature="F1"Result="pass" 我需要得到ID的計數功能1項。刪除重複項。

我熟悉LINQ和C#List及其在C#中的單行代碼中可實現的功能。但與QList我有點困惑。

+0

你需要符合標準或的「ID」值數每場比賽在比賽中出現的次數? 也就是說你需要輸出爲'1'(只有Id1符合標準)或像'[Id1 - > 3]'(Id1匹配標準3次)的地圖 –

回答

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.

需要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(); 
+0

在你的問題中說你開始使用Qt,所以請回答學習如何使用QList。 – eyllanesc

+0

@eyllanesc代碼對於'QList'來說是相同的,所以我不理解你的downvote或評論。此外,OP沒有聲明他正在學習使用'QList',但他正在使用它,很可能是因爲他來自C#,其中'List'是默認容器。我只是指出它不應該被認爲是Qt中的默認值。 – Resurrection

+0

他說:「但在QList我有點困惑」和「我是一些誰是QT新手」 – eyllanesc