【发布时间】:2014-11-13 16:41:36
【问题描述】:
在related question 中,我询问了如何根据所述对象的某些字段在 c++ 中的对象向量中获取最大元素的值。我扩展了算法来获取那个最大元素的索引,这样我以后就可以从对象的向量中弹出它。
这是我现在使用的代码,它运行良好:
vector<MyOwnClass> scoretracker // MyOwnClass has a ".score" field
// Some code filling scoretracker
auto max = std::max_element(scoretracker.begin(), scoretracker.end(),
[] (const MyOwnClass &a, const MyOwnClass &b )
{
return a.score < b.score; // I am not sure how this line works
});
int index = distance(scoretracker.begin(), max);
所以,我尝试修改它以获得 第二高(或第 n 个值)而不是最大值,但到目前为止我的尝试失败了。
这让我意识到我真的不明白为什么“return a.score
通过查看 max_element works 的方式,我不确定它是否可以用来找到第二大的。
哦,最后,我宁愿不从向量中pop_back最高值,找到新的最大值(原始向量中的第二个最大值)并添加一些逻辑来恢复原始版本。好吧,如果我必须这样做,我会这样做,但可能会有一些迭代器属性或其他我不知道的东西......
【问题讨论】:
-
您可以只使用
std::sort,而不是max_element。然后你可以通过索引排序的数组(或者如果你想要的排序副本)来找到第 1 个、第 2 个或第 n 个最高元素。 -
好的,我现在正在尝试一些实现!
-
why "return a.score < b.score" returns the highest value这是对值进行排序的谓词。 在值排序之后做什么取决于算法。 -
@Cyber 好的,我错过了您评论中的最后几句话。如果不想破坏向量的顺序,只需对副本进行排序。我会看看它在我的过程中吃了多少时间。谢谢!
-
@PaulMcKenzie 感谢您的精确! :)
标签: c++ object vector iterator field