2013-05-04 85 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; 
}