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

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

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

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

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

用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%
#include
#include
#include
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)”: 无法将参数 1 从“int”转换为“std::vector

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

源码:

template _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()实现查找的功能。(即通过回调函数返回拿到迭代器)

该回答引用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()的一个匿名实例。

问题我已经解决了,GPT的解决方法我试过了,不行。for_each()函数是强制进行了元素从beg到end的遍历,并返回仿函数的最终状态,所以做不到题主的要求。要想实现返回特定查找元素的迭代器,还是得用find_if();