迭代时 C++ 更改列表?

C++ change list while iterating?

C++11 中有一个名为 jobs 的列表,其中我想删除所有停止标志为 true 的作业,所以我写道:

auto job = jobs.begin();
while (job != jobs.end()) {
    if (!job->stopped) {
        job = jobs.erase(job)
    } else {
        ++job;
    }
}

但是有人看了我的代码说这是错误的,我不明白为什么?

如果不考虑此语句中缺少分号的拼写错误

job = jobs.erase(job)
                    ^^^

和这个条件下的第二个错字

if (!job->stopped) {
    ^^^^

应该这样写

if ( job->stopped) {

(即您需要删除所有带有设置标志 stopped 的作业)您的代码是正确的但多余。

你可以直接写

jobs.remove_if( []( const auto &job ) { return job.stopped; } );

jobs.remove_if( []( const JobEntry &job ) { return job.stopped; } );

如果在成员函数中调用此语句。

编辑:这是一个使用您的 class 声明的演示程序。

#include <iostream>
#include <string>
#include <list>
#include <ctime>

typedef int pid_t;

class JobsList {
public:
    class JobEntry {
    public:
        pid_t pid, jid;
        std::string cmd;
        time_t in_time;
        bool stopped;

        JobEntry( int pid, int jid, const std::string &cmd, bool stopped )
            :pid( pid ), jid( jid ), cmd( cmd ), stopped( stopped )
        {}
        // TODO: Add your data members

        bool operator<( JobEntry const &tmp ) const {
            return jid < tmp.jid;
        }

        bool operator==( JobEntry const &tmp ) const {
            return jid == tmp.jid;
        }
    };
    std::list<JobEntry> jobs;
};

int main()
{
    JobsList jobs_list =
    {
        {
            { 1, 1, "first", false },
            { 2, 2, "second", true }
        }
    };

    std::cout << jobs_list.jobs.size() << '\n';
    jobs_list.jobs.remove_if( []( const auto &job ) { return job.stopped; } );
    std::cout << jobs_list.jobs.size() << '\n';
}

为了简单起见,我只介绍了这个 typedef

typedef int pid_t;

并更改了构造函数中的一个参数声明

JobEntry( int pid, int jid, const std::string &cmd, bool stopped )
                            ^^^^^^^