问题描述
我想实现一个函数,它遍历一个列表并在匹配时返回一个指针。我写道:
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;
}