使用 std::find 和用户提供的谓词 - 自制的 find() 重载
Using std::find with user supplied predicate - homemade find() overload
我有一个类,它本质上是一个具有一些附加功能的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
(重载 #3-4(,它将谓词作为第三个参数。
使用谓词时,请使用 std::find_if
。
int my::find(const std::function<bool(const T&)>& pred) {
auto iter = std::find_if(this->data.begin(), this->data.end(), pred);
...
}
为了与标准库中的函数名称保持一致,我认为在使用谓词时,您也应该将函数名称更改为find_if
。
int my::find_if(const std::function<bool(const T&)>& pred) {
auto iter = std::find_if(this->data.begin(), this->data.end(), pred);
...
}
相关文章:
- 继承函数的重载解析
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 你能重载对象变量名本身返回的内容吗
- 从父命名空间重载类型
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 重载操作程序时出错>>用于类中的字符串 memebr
- 一个关于在C++中重载布尔运算符的问题
- 不同翻译单元中不可重载的非内联函数定义
- 为什么使用SFINAE而不是函数重载
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 将重载的成员函数传递给函数模板
- c++:可变模板和函数重载
- 使用 std::find 和用户提供的谓词 - 自制的 find() 重载
- 重载 map::key_comp,以便我可以在对象指针的地图上使用 map::find
- C++std::set Find函数重载==运算符
- find()相等运算符重载
- find() 使用重载运算符==
- C++ 不同类的 Map<>.find() 重载
- 重载自定义类的std::find