How to use lambda auto parameters in C++11
auto, c++, c++11
Solution
C++11 doesn't support generic lambdas. That's what `auto` in the lambda's parameter list actually stands for: a generic parameter, comparable to parameters in a function template. (Note that the `const` isn't the problem here.)
Note: C++14 does support lambdas with `auto`, `const auto`, etc. You can read about it here.
You have basically two options:
Type out the correct type instead of `auto`. Here it is the element type of `X`, which is `pair<double, vector<int>>`. If you find this unreadable, a typedef can help.
std::stable_sort(X.rbegin(), X.rend(),
[](const pair<double, vector<int>> & lhs,
const pair<double, vector<int>> & rhs)
{ return lhs.first < rhs.first; });
Replace the lambda with a functor which has a call operator template. That's how generic lambdas are basically implemented behind the scene. The lambda is very generic, so consider putting it in some global utility header. (However do not `using namespace std;` but type out `std::` in case you put it in a header.)
struct CompareFirst {
template <class Fst, class Snd>
bool operator()(const pair<Fst,Snd>& l, const pair<Fst,Snd>& r) const {
return l.first < r.first;
}
};
std::stable_sort(X.rbegin(), X.rend(), CompareFirst());
Problem
I have a code in C++14. However, when I used it in C++11, it has an error at `const auto`. How to use it in C++11? ``` vector<vector <int> > P; std::vector<double> f; vector< pair<double, vector<int> > > X; for (int i=0;i<N;i++) X.push_back(make_pair(f[i],P[i])); ////Sorting fitness descending order stable_sort(X.rbegin(), X.rend()); std::stable_sort(X.rbegin(), X.rend(), [](const auto&lhs, const auto& rhs) { return lhs.first < rhs.first; }); ```