如何在 C++11 中使用 lambda 自动参数
How to use lambda auto parameters in C++11
我有一个 C++14 的代码。但是,当我在 C++11 中使用它时,它在 const auto
处出现错误。如何在 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; });
C++11 不支持通用 lambdas。这就是 lambda 参数列表中的 auto
实际上代表的意思:通用参数,类似于函数模板中的参数。 (请注意,const
不是这里的问题。)
Note: C++14 does support lambdas with auto
, const auto
, etc. You can read about it here.
你基本上有两个选择:
键入 正确的类型 而不是 auto
。这里是X
的元素类型,即pair<double, vector<int>>
。如果您发现它不可读,typedef 可以提供帮助。
std::stable_sort(X.rbegin(), X.rend(),
[](const pair<double, vector<int>> & lhs,
const pair<double, vector<int>> & rhs)
{ return lhs.first < rhs.first; });
将 lambda 替换为具有 调用运算符模板 的仿函数。这就是通用 lambda 基本上是如何在幕后实现的。 lambda 非常通用,因此请考虑将其放入某些全局实用程序 header。 (但是不要 using namespace std;
而是输入 std::
以防你把它放在 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());
不幸的是,采用 auto
(无论 const
与否)的通用 lambda 是 C++14 独有的特性。
请参阅此处 https://isocpp.org/wiki/faq/cpp14-language#generic-lambdas 了解更多详细信息。
const auto
在 C++11 中不支持作为 lambda 参数(实际上在 C++11 中不支持通用 lambda)。
修复:
using pair_type = std::pair<double, std::vector<int>>;
vector<pair_type> X;
std::stable_sort(X.rbegin(), X.rend(),
[](const pair_type&lhs, const pair_type& rhs)
{ return lhs.first < rhs.first; });
我知道有一个公认的答案,但你也可以在 C++11 中使用 decltype
,它看起来有点乱......
stable_sort(X.rbegin(), X.rend(), [](decltype(*X.cbegin()) lhs, decltype(lhs) rhs) { return lhs.first < rhs.first; });
在此处使用 cbegin()
,因为您获得容器的 const 正确 value_type
。
或者你可以直接使用带有decltype
的容器的value_type
typedef,比如
std::stable_sort(X.rbegin(), X.rend(),
[](const decltype(X)::value_type & lhs,
const decltype(X)::value_type & rhs)
{return lhs.first < rhs.first; }
);
我有一个 C++14 的代码。但是,当我在 C++11 中使用它时,它在 const auto
处出现错误。如何在 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; });
C++11 不支持通用 lambdas。这就是 lambda 参数列表中的 auto
实际上代表的意思:通用参数,类似于函数模板中的参数。 (请注意,const
不是这里的问题。)
Note: C++14 does support lambdas with
auto
,const auto
, etc. You can read about it here.
你基本上有两个选择:
键入 正确的类型 而不是
auto
。这里是X
的元素类型,即pair<double, vector<int>>
。如果您发现它不可读,typedef 可以提供帮助。std::stable_sort(X.rbegin(), X.rend(), [](const pair<double, vector<int>> & lhs, const pair<double, vector<int>> & rhs) { return lhs.first < rhs.first; });
将 lambda 替换为具有 调用运算符模板 的仿函数。这就是通用 lambda 基本上是如何在幕后实现的。 lambda 非常通用,因此请考虑将其放入某些全局实用程序 header。 (但是不要
using namespace std;
而是输入std::
以防你把它放在 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());
不幸的是,采用 auto
(无论 const
与否)的通用 lambda 是 C++14 独有的特性。
请参阅此处 https://isocpp.org/wiki/faq/cpp14-language#generic-lambdas 了解更多详细信息。
const auto
在 C++11 中不支持作为 lambda 参数(实际上在 C++11 中不支持通用 lambda)。
修复:
using pair_type = std::pair<double, std::vector<int>>;
vector<pair_type> X;
std::stable_sort(X.rbegin(), X.rend(),
[](const pair_type&lhs, const pair_type& rhs)
{ return lhs.first < rhs.first; });
我知道有一个公认的答案,但你也可以在 C++11 中使用 decltype
,它看起来有点乱......
stable_sort(X.rbegin(), X.rend(), [](decltype(*X.cbegin()) lhs, decltype(lhs) rhs) { return lhs.first < rhs.first; });
在此处使用 cbegin()
,因为您获得容器的 const 正确 value_type
。
或者你可以直接使用带有decltype
的容器的value_type
typedef,比如
std::stable_sort(X.rbegin(), X.rend(),
[](const decltype(X)::value_type & lhs,
const decltype(X)::value_type & rhs)
{return lhs.first < rhs.first; }
);