将列表迭代器转换为指针不起作用?
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;
}
我想实现一个迭代列表的函数,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;
}