我有一个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; });
Run Code Online (Sandbox Code Playgroud)
lee*_*mes 31
C++ 11不支持通用lambdas.这就是autolambda参数列表实际上代表的内容:泛型参数,与函数模板中的参数相当.(注意const这里不是问题.)
你基本上有两个选择:
输入正确的类型而不是auto.这是的元素类型const auto,这是auto.如果您发现这是不可读的,则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; });
Run Code Online (Sandbox Code Playgroud)用带有调用操作符模板的仿函数替换lambda .这就是通用lambda基本上是在幕后实现的.lambda非常通用,所以考虑将它放在一些全局实用程序头中.(但不要X输入pair<double, vector<int>>,以防你把它放在标题中.)
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;
}
};
Run Code Online (Sandbox Code Playgroud)
std::stable_sort(X.rbegin(), X.rend(), CompareFirst());
Run Code Online (Sandbox Code Playgroud)Nim*_*Nim 11
我知道有一个公认的答案,但你也可以decltype在C++ 11中使用它,它看起来有点凌乱......
stable_sort(X.rbegin(), X.rend(), [](decltype(*X.cbegin()) lhs, decltype(lhs) rhs) { return lhs.first < rhs.first; });
Run Code Online (Sandbox Code Playgroud)
cbegin()在这里使用,因为你得到value_type容器的const正确.
不幸的是,通用lambda采用auto(无论是否const)仅是C++ 14的特性.
有关更多详细信息,请参见https://isocpp.org/wiki/faq/cpp14-language#generic-lambdas.
| 归档时间: |
|
| 查看次数: |
15634 次 |
| 最近记录: |