将列表迭代器转换为指针不起作用?

Convert list iterator to pointer doesn't work?

我想实现一个迭代列表的函数,returns 一个指针以防匹配。我写道:

std::list<JobEntry> jobs;

JobsList::JobEntry *JobsList::getJobById(int jobId) {
    for (auto const& job : jobs) {
        if (job.pid==jobId) {
            return std::addressof(*job);
        }
    }
    return nullptr;
}

但这行不通,我该怎么做?

getJobById() 声明为 return 指向非常量 JobEntry 对象的指针,但 job 是对 const JobEntry 对象的引用。您不能将指向常量的指针分配给指向非常量的指针。所以删除 const.

此外,range-based for loop 在内部处理迭代器,因此 job 是您想要 return 指向的实际对象,而不是对象的迭代器,所以不要尝试取消引用它。

JobsList::JobEntry* JobsList::getJobById(int jobId) {
    for (auto &job : jobs) {
        if (job.pid == jobId) {
            return std::addressof(job);
        }
    }
    return nullptr;
}

也就是说,考虑使用标准 std::find_if() 算法而不是手动循环:

#include <algorithm>

JobsList::JobEntry* JobsList::getJobById(int jobId) {
    auto iter = std::find_if(jobs.begin(), jobs.end(),
        [=](const JobEntry &job) { return job.pid == jobId; }
    );
    if (iter != jobs.end())
        return std::addressof(*iter);
    return nullptr;
}