c++ - 如何使用 find_if 获取最后一个迭代器?
问题描述
我正在尝试find_if
在具有 Lambda 表达式的函数中使用。我想得到向量的最后一个迭代器,但我不知道怎么写。
我可以使用此代码获得第一个迭代器。在这段代码中,struct 有一个索引和分数。代码中的向量保存结构,如果索引是 5 的倍数,则分数比平时要高。在这段代码中,第一个迭代器的索引是 5,最后一个迭代器的索引是 25。
struct Recorder
{
Recorder(int idx, float score)
{
this->idx = idx;
this->score = score;
}
int idx;
float score;
};
int main(int argc, char** argv)
{
std::vector<std::shared_ptr<Recorder>> recorders;
for (int i = 0; i < 30; ++i)
{
float score = 0.3;
bool isLost = false;
if (i % 5 == 0 && i != 0) score = 0.8;
std::shared_ptr<Recorder> poseRecord = std::make_shared<Recorder>(i, score);
recorders.push_back(poseRecord);
}
auto record = std::find_if(recorders.begin(), recorders.end(),
[](const std::shared_ptr<Recorder>& r) {
return (r->score >= 0.8f);
});
std::cout << "idx : " << (*record)->idx << std::endl;
return 0;
}
如何获得此代码中的最后一次迭代?(这里(*record)->idx
应该是 25)。
解决方案
您可以使用反向迭代器从另一端开始搜索。此外,正如 Fureeish 和 Ted 在评论中指出的那样,将共享指针作为引用传递给 lambda 函数会更有效。
auto record = std::find_if(recorders.rbegin(), recorders.rend(),
[&](const std::shared_ptr<Recorder> & r) {
return (r->isLost == false && r->score >= 0.8f);
});
推荐阅读
- batch-file - 如何使用 windows cmd 更改 CSV 文件中的日期格式?
- apache-spark - 如何增加每次重试失败下载之间的延迟
- python - 透视一个两列数据框
- android - 当我有意启动它时,为什么android无法识别第二个活动?
- javascript - Chrome 扩展内容脚本 - 使用 JavaScript 抓取 YouTube 视频标题
- spring-boot - 捕获 404 错误 spring boot 以返回自定义 html
- php - 如何从 laravel 表单发布到外部 php?
- c# - IMapper.map() 函数返回空值对象。自动映射器问题
- php - PHP:使用 openssl_encrypt 加密文件
- c# - 如何在 Oracle 查询“Select-For-Update”中参数化等待时间