【发布时间】:2020-12-24 10:05:29
【问题描述】:
所以我经常想对一系列元素执行一些 STL 算法,而不是比较函数,我想传递一个一元函数 f。
例如我想写这样的东西
std::max_element(begin(range), end(range), f);
在应用 f 之后找到范围内的最大元素。 我目前的解决方法是这样的:
std::max_element(begin(range), end(range, [&f](auto a, auto b){ return f(a) < f(b); });
乍一看,这似乎没有问题。但是 f 本身可能是一个 lambda 表达式,或者以另一种方式比 f 更复杂。 我对那段代码有两个问题: a) 它很容易出错,因为人们可能会意外地写出 f(a)
很遗憾,我在标准库(甚至是boost)中没有找到解决这类问题的好方法,所以想问一下你对这个问题的解决方案是什么。算法中不存在这种重载有什么原因吗?
【问题讨论】:
-
Boost 的transform iterator 似乎正是您要找的。换句话说,应该调整的是您传递给 max_element 的迭代器,而不是比较器。
-
对于标准库,使用现有函数是不可能的。您需要
std::transform和max_element的组合。您可以编写一个非常简单的模板化包装函数来实现这一点。这并不复杂。 3 行代码。 . . -
感谢这个想法!我仍然不知道如何避免这个问题。那里给出的例子也存在代码重复的问题。
-
标准库函数不能涵盖所有可能的需求。总会有一些时候你需要一些不同的东西。您始终可以编写自己的函数来满足您的特定需求。您仍然可以利用标准库来完成这项任务的核心部分。
-
这能回答你的问题吗? Very generic argmax function in C++ wanted