Is there any difference between normal function
Code
and a function created using std::function
Code
# | User | Rating |
---|---|---|
1 | tourist | 3993 |
2 | jiangly | 3743 |
3 | orzdevinwang | 3707 |
4 | Radewoosh | 3627 |
5 | jqdai0815 | 3620 |
6 | Benq | 3564 |
7 | Kevin114514 | 3443 |
8 | ksun48 | 3434 |
9 | Rewinding | 3397 |
10 | Um_nik | 3396 |
# | User | Contrib. |
---|---|---|
1 | cry | 167 |
2 | Um_nik | 163 |
3 | maomao90 | 162 |
3 | atcoder_official | 162 |
5 | adamant | 159 |
6 | -is-this-fft- | 158 |
7 | awoo | 155 |
8 | TheScrasse | 154 |
9 | Dominater069 | 153 |
10 | djm03178 | 152 |
Is there any difference between normal function
#include<bits/stdc++.h>
using namespace std;
int square(int a)
{
return a*a;
}
int main()
{
cout<<square(5);
return 0;
}
and a function created using std::function
#include<bits/stdc++.h>
using namespace std;
int main()
{
function<int(int)> square=[&](int a){
return a*a;
};
cout<<square(5);
return 0;
}
Name |
---|
Yep -> Here
So i've extensively and exclusively used std::function for a long time (not anymore, for the reasons ill state) and this is what i have to say:
The main advantage of std::function over regular functions is that you cam make functions that use variables inside the scope youre in. It's a lot of times, very unpractical to create helper functions that make use of variables or arrays inside the code, and creating it inside the main function is valuable in those situations
The main problem with std::function is that its slow (specially if the ammount of captures you use is large) and replaceable by lambda functions (they have the same declaration, except with auto instead of std::function).
Lambdas are faster and a lot of the times more practical. The only problem with them is that recursion is iffy, you need to pass the own function as paremeter, however with std::function you need to include the parameters and return type in the typename, which is equally annoying.
IMO you don't ever need
std::function
in competitive programming. Whenever you want to pass a function as a parameter to another function, useauto
(C++20) or template functions (before C++20), or if you're passing it to a constructor, use a template class.Regarding your last point, both approaches have some flaws, but in my experience
auto self
is shorter and of course it doesn't have any overhead.Agreed. Reading again i see i didnt make it clear that i switched for lambdas (now its editted)
if you are one who doesn't like self passing shit in lambdas but at the same time hate typing signature for std:: function I recommend this short define:
and just code like usual function:
P. S. I know about slowness and about y_combinator
oh, someone explain me this downvote mania
they didn't got uhh
Yes, take an example:
You don't really need global variables when using std::functions.