I was going through techiedelight article link
I didn't get the meaning of [&m](char &c) { m[c] ; }
in std::for_each(s.begin(), s.end(), [&m](char &c) { m[c] ; });
#include <iostream>
#include <unordered_map>
#include <algorithm>
int main()
{
std::unordered_map<char, int> m;
std::string s("abcba");
std::for_each(s.begin(), s.end(), [&m](char &c) { m[c] ; });
char ch = 's';
if (m.find(ch) != m.end()) {
std::cout << "Key found";
}
else {
std::cout << "Key not found";
}
return 0;
}
Someone please explain how it is working. Thanks in advance.
CodePudding user response:
[&m](char &c) { m[c] ; }
this is a lambda. A lambda is an anonymously typed function object using shorthand.
It is shorthand for roughly:
struct anonymous_unique_secret_type_name {
std::unordered_map<char, int>& m;
void operator()(char& c)const {
m[c] ;
}
};
std::for_each(s.begin(), s.end(), anonymous_unique_secret_type_name{m} );
the [&m](char &c) { m[c] ; }
both creates the type and constructs an instance. It captures (by reference) the variable m
, which it exposes as m
within its body.
As a function-like object (aka a function object), it has an operator()
that can be called like a function. Here this operator()
takes a char&
and returns void
.
So for_each
calls this function object on each element of the ranged passed (in this case, the string).