gpt4 book ai didi

c++ - 在集合上使用 lambda 表达式和 find_if

转载 作者:太空狗 更新时间:2023-10-29 20:29:13 27 4
gpt4 key购买 nike

我有一个容器对象:

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 传递到 lambda 中,我怀疑你的意思是 const T&v
  • 您使用了一个 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;
}

关于c++ - 在集合上使用 lambda 表达式和 find_if,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10717485/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com