迭代结构列表

时间:2013-05-04 08:53:28

标签: c++ list struct iterator

我正在创建一个结构列表:

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;
        }
    }

我哪里错了? 我得到:在&#39; - &gt;&#39;之前缺少模板参数令牌

4 个答案:

答案 0 :(得分: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::一致,因为taskList属于std::list<?>类型,C ++编译器将为您查找std - 命名空间中的这些函数。

答案 1 :(得分:0)

喜欢这个

if (iterator->is_done==true){

无需*->

不是你问的问题,而是

if (iterator->is_done==true) {

与更容易理解

完全相同
if (iterator->is_done) {

不要将布尔值与真假相比较,它们已经是真假。

答案 2 :(得分: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;

答案 3 :(得分: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;
}