对集合使用 lambda 表达式和find_if
using lambda expression and find_if on a collection
我有一个容器对象:
R Container;
R 的类型为 list<T*>
或 vector<T*>
我正在尝试编写以下函数:
template<typename T, typename R>
T& tContainer_t<T, R>::Find( T const item ) const
{
typename R::const_iterator it = std::find_if(Container.begin(), Container.end(), [item](const R&v) { return item == v; });
if (it != Container.end())
return (**it);
else
throw Exception("Item not found in container");
}
尝试该方法时(v 是我类的对象)
double f = 1.1;
v.Find(f);
我得到binary '==' : no operator found which takes a left-hand operand of type 'const double' (or there is no acceptable conversion)
我对 lambda 表达式语法和我应该在那里写什么感到困惑,找不到任何友好的解释。
怎么了?10倍。
缺少一些上下文,但我注意到:
- 您返回
**it
,因此您可能想要比较*v==itemt
- 你把
const R&v
我怀疑你的意思是const T&v
到lambda的地方 - 您使用了const_iterator,但返回了非常量引用。那是不匹配的
- 为了提高效率,我做了一些参数const&(并支持不可复制/不可移动的类型)
以下是工作代码,去除了缺少的类引用:
#include <vector>
#include <algorithm>
#include <iostream>
template<typename T, typename R=std::vector<T> >
T& Find(R& Container, T const& item )
{
typename R::iterator it = std::find_if(Container.begin(), Container.end(), [&item](const T&v) { return item == v; });
if (it != Container.end())
return *it;
else
throw "TODO implement";
}
int main(int argc, const char *argv[])
{
std::vector<double> v { 0, 1, 2, 3 };
Find(v, 2.0); // not '2', but '2.0' !
return 0;
}
相关文章:
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 我的简单if-else语句是如何无法访问的代码
- 如何将enable-if与模板参数和参数包一起使用
- 无论条件是否为true,if总是在c++中执行
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- OpenMP卸载说'fatal error: could not find accel/nvptx-none/mkoffload'
- Insert函数不适用于2 if语句C++
- If语句未被求值C++
- C++嵌套if语句,基本货币交换
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 是否可以使用if constexpr删除控制流语句
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 如何删除peer if else分支中的冗长句子
- 我似乎对if/else的基本语句有问题:/
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- if数组上的随机数
- 将按位if条件转换为普通if条件
- If语句在c++中被忽略
- 比较if语句中的数组值和int值
- 为什么 SearchBack 中的 if (find == A[i]) 除了第一次之外没有给出 true?在调试时,除了第一次之外显然不起作用