c++ - 将 std::find 与用户提供的谓词一起使用 - 自制 find() 重载
问题描述
我有一个类,它本质上是一个std::vector<T>
具有一些附加功能的类。该类具有find(const T& value )
将返回第一次出现value
或-1的索引的方法:
int my::find(const T& value) {
auto iter = std::find(this->data.begin(), this->data.end(), value);
if (iter == this->data.end())
return -1;
return std::distance(this->data.begin(), iter);
}
都好。然后,我想创建一个find()
重载,它采用任意谓词而不是值 - 我尝试过:
int my::find(const std::function<bool(const T&)>& pred) {
auto iter = std::find(this->data.begin(), this->data.end(), pred);
...
}
并且:
template <typename P>
int my::find(P&& pred) {
auto iter = ...
}
但是这两种情况都无法编译,因为“编译器”试图在类型值pred
的向量中查找,而不是应用于值,即当我实例化时,我得到编译器错误,例如:pred
pred
my<int>
/usr/include/c++/5/bits/predefined_ops.h:194:17: error: no match for ‘operator==’ (operand types are ‘int’ and ‘const std::function<bool(const int&)>’)
{ return *__it == _M_value; }
解决方案
该算法std::find
将始终将其第三个参数视为与给定序列中的元素进行比较的值operator==
。您传入的谓词无法与T
类的实例进行比较,因此会出现编译器错误。
您正在寻找std::find_if
(overloads #3-4),它将谓词作为第三个参数。
推荐阅读
- javascript - 在 ChartJs 中获取背景中的多个框
- c# - 无法更新我自己的 Windows 服务,因为它正被另一个进程使用
- android - 有没有办法检测文本的含义并判断它与另一个文本的相似性?
- javascript - 如何在 CakePHP4 中使用 sortablejs 库?
- python - 使用pywin32将带有日文字符的CSV文件导入Excel
- python-3.x - 在机器人离线之前运行命令
- sas - 如何将 SAS 中的 x 变量与 proc freq 分组?-- 在 SAS proc 中使用交叉表对类别进行分组
- python - 无法加载需要“wx”交互式框架的后端“WXAgg”,因为“无头”当前正在运行
- r - 当您在同一台机器上有多个 R 版本时如何更改默认库路径
- c# - 将最新的 chrome 引擎与您的 UWP 构建打包在一起,以避免 PWA 的 Web 视图中的旧 Internet Explorer 问题