2013-05-04 87 views
0

我創建結構清單列表:迭代結構

struct task{ 
    int task_id; 
    bool is_done; 
    char* buffer; 
    int length; 

} task; 
list<task> taskList; 

,並試圖遍歷任務,以檢查is_done狀態:

for (std::list<task>::const_iterator iterator = taskList.begin(), end = taskList.end(); iterator != end; ++iterator) { 

     if(iterator->is_done) { 
      return 1; 
     } else { 
      return 2; 
     } 
    } 

我在哪裏錯了? 我得到:之前缺少模板參數 ' - >' 令牌

+0

你哪裏錯了? – 2013-05-04 08:57:08

+0

你會得到什麼錯誤? – 2013-05-04 08:57:08

+2

@nosid:通常被稱爲星號。 – 2013-05-04 09:01:59

回答

3

迭代器的operator->已經取消引用。因此,而不是

if(*iterator->is_done==true) 

你需要

if(iterator->is_done==true) 

相當於

if((*iterator).is_done==true) 

其作爲一個旁註相當於易於閱讀

if((*iterator).is_done) 

if(iterator->is_done) 

。更妙的是,你還可以使用std::any_of

#include <algorithm> 

.... 

if (any_of(begin(taskList), end(taskList), 
    [](task const &t) { return t.is_done; })) 
{ 
    return 1; 
} else { 
    return 2; 
} 

非正式注:沒有必要限定any_ofbeginendstd::,因爲taskListstd::list<?>型和C++ - 編譯器將查找這些功能在std -namespace已經爲你。

+0

此問題未使用[C++ 11]標記,爲什麼建議使用lambda函數? – trojanfoe 2013-05-04 18:06:46

+0

@trojanfoe:因爲現在是2013年。 – 2013-05-05 05:31:59

+0

是的,但是C++ 11仍然不常用,例如在Red Hat 6,HP/UX,AIX,Solaris中? – trojanfoe 2013-05-05 17:15:37

0

像這樣

if (iterator->is_done==true){ 

不需要*->

而不是你問這個問題,但

if (iterator->is_done==true) { 

是完全一樣的更容易理解

if (iterator->is_done) { 

不要布爾值比較真假,他們已經是真假。

+0

不幸的是,在英語語言中,'不需要*和 - >。'是不明確的:它是不需要(*和 - >)還是'(不需要*)和(不需要 - >) '?(!;迭代=端; ++迭代器的std ::列表 ::爲const_iterator迭代= taskList.begin(),結束= taskList.end()){ \t如果 \t爲: – 2013-05-04 09:00:43

+0

謝謝,現在我「使用M個(iterator-> is_done){ \t \t回1; \t} \t其他{ \t \t回2; \t} 我也得到:前 MISSING模板參數 ')' 令牌 – 2013-05-04 09:01:40

+0

通常你會說「不需要* * * * * * d *' - >'「來消除歧義。 – 2013-05-04 09:01:50

0

使用std::find_if代替:

#include <algorithm> 

... 

bool isDone(const task &task) 
{ 
    return task.is_done; 
} 

... 

return std::find_if(taskList.begin(), taskList.end(), isDone) == taskList.end() ? 2 : 1; 
+0

怎麼樣'any_of'呢? – 2013-05-04 09:02:30

+0

@phresnel使用它有什麼好處嗎? – trojanfoe 2013-05-04 09:03:04

+0

它不那麼冗長(「'== taskList.end'」),需要較少的標準庫知識(「'== taskList.end'」),並且返回yes/no-answer而不是「完全成熟」迭代器,你在表達式的末尾扔掉了,這意味着語義更加清晰。 /例如,請參閱我的答案。 – 2013-05-04 09:10:32

0

試試這個。注意更改爲任務結構和引用迭代器。 (我改變了迭代器的名稱 - 更簡潔 - 但實際上並不需要)。我只是覺得看起來不那麼困惑。

#include <list> 

using namespace std; 

struct task{ 
    int task_id; 
    bool is_done; 
    char* buffer; 
    int length; 

}; 


int main() { 

    std::list<task> taskList; 
    task task1; 
    task1.buffer = "qwerty"; 
    task1.is_done = true; 
    task1.length = 6; 
    task1.task_id = 1; 
    taskList.push_back(task1); 


    for (std::list<task>::const_iterator it = taskList.begin(), end = taskList.end(); 
     it != end; ++it) { 
     if((*it).is_done==true) 
      return 1; 
     else 
      return 2; 
    } 

    return 0; 
}