m0_65699050 2023-03-02 20:37 采纳率: 80%
浏览 12

刚刚接触STL,想问问for_each()函数中回调函数的相关问题

问题遇到的现象和发生背景

我想要通过仿函数和for_each()实现查找的功能。(即通过回调函数返回拿到迭代器)

遇到的现象和发生背景,请写出第一个错误信息

错误 C2664 “void mysearch::operator ()(std::vector<int,std::allocator>)”: 无法将参数 1 从“int”转换为“std::vector<int,std::allocator>”

用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
class mysearch
{
public:
    void  operator()(vector<int>v) {
        it = v.begin();
        for (; it != v.end(); ++it)
        {
            if (*it == 4)
            break;
        }
    }
public:
    vector<int>::iterator it;
};
int main()
{
    vector<int>v;
    for (int i = 0; i < 10; ++i)
        v.push_back(i);
    mysearch search;
   search = for_each(v.begin(), v.end(), mysearch());
    cout << *(search.it) << endl;
    return 0;
}

运行结果及详细报错内容

错误 C2664 “void mysearch::operator ()(std::vector<int,std::allocator>)”: 无法将参数 1 从“int”转换为“std::vector<int,std::allocator>”

我的解答思路和尝试过的方法,不写自己思路的,回答率下降 60%

源码:

template <class _InIt, class _Fn>
_CONSTEXPR20 _Fn for_each(_InIt _First, _InIt _Last, _Fn _Func) { // perform function for each element [_First, _Last)
    _Adl_verify_range(_First, _Last);
    auto _UFirst      = _Get_unwrapped(_First);
    const auto _ULast = _Get_unwrapped(_Last);
    for (; _UFirst != _ULast; ++_UFirst) {
        _Func(*_UFirst);

本来仿函数是这样写的,我想要通过仿函数和for_each()实现查找的功能,改成上面提问的代码块后还是不可以。

class mysearch
{
public:
    vector<int>::iterator operator()(vector<int>v){
        vector<int>::iterator it=v.begin();
    for(;it!=v.end();++it)
    {
    if(*it==4)
    return it;
    }    
    }
};
我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏”

我想要通过仿函数和for_each()实现查找的功能。(即通过回调函数返回拿到迭代器)

  • 写回答

2条回答 默认 最新

  • MarkHan_ 2023-03-02 20:59
    关注

    该回答引用GPTᴼᴾᴱᴺᴬᴵ
    在您的代码中,mysearch类的operator()函数接收的是一个vector类型的参数。但是,在调用for_each()函数时,您的第三个参数是mysearch类的一个实例,而mysearch()表示的是一个无参构造函数。因此,for_each()函数会试图将整数参数传递给mysearch类的operator()函数,导致了错误。
    -
    要解决这个问题,您需要将mysearch()修改为mysearch对象的一个实例,并将该实例传递给for_each()函数。然后,for_each()函数将调用mysearch类的operator()函数,其中参数是迭代器所指向的值。可以按以下方式修改代码:

    int main()
    {
        vector<int> v;
        for (int i = 0; i < 10; ++i)
            v.push_back(i);
        mysearch search;
        search = for_each(v.begin(), v.end(), mysearch());
        cout << *(search.it) << endl;
        return 0;
    }
    
    
    

    将其修改为:

    int main()
    {
        vector<int> v;
        for (int i = 0; i < 10; ++i)
            v.push_back(i);
        mysearch search;
        for_each(v.begin(), v.end(), search);
        cout << *(search.it) << endl;
        return 0;
    }
    
    
    

    这里,您需要将mysearch()更改为search。现在,for_each()函数将接收mysearch对象的实例,而不是mysearch()的一个匿名实例。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月2日

悬赏问题

  • ¥15 解决一个加好友限制问题 或者有好的方案
  • ¥15 关于#java#的问题,请各位专家解答!
  • ¥15 急matlab编程仿真二阶震荡系统
  • ¥20 TEC-9的数据通路实验
  • ¥15 ue5 .3之前好好的现在只要是激活关卡就会崩溃
  • ¥50 MATLAB实现圆柱体容器内球形颗粒堆积
  • ¥15 python如何将动态的多个子列表,拼接后进行集合的交集
  • ¥20 vitis-ai量化基于pytorch框架下的yolov5模型
  • ¥15 如何实现H5在QQ平台上的二次分享卡片效果?
  • ¥30 求解达问题(有红包)