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

问题描述

我想实现一个函数,它遍历一个列表并在匹配时返回一个指针。我写道:

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() 被声明为返回指向非常量 JobEntry 对象的指针,但 job 是对 const JobEntry 对象的引用。您不能将指向常量的指针分配给指向非常量的指针。所以去掉 const

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

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