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は汎用ラムダをサポートしていません。それが、ラムダのパラメーターリストのauto
が実際に表すものです:関数テンプレートのパラメーターに匹敵するジェネリックパラメーター。 (const
はここでは問題ではないことに注意してください。)
注:C++ 14doesは、
auto
、const auto
など。あなたはそれについて読むことができます ここ 。
基本的に2つのオプションがあります:
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; });
ラムダをcall operator templateを持つファンクターに置き換えます。これが、一般的なラムダの基本的な実装方法です。ラムダは非常に汎用的なため、グローバルユーティリティヘッダーに含めることを検討してください。 (ただし、using namespace std;
ただし入力するstd::
ヘッダーに挿入した場合。)
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());
受け入れられた答えがあることは知っていますが、これにはC++ 11でdecltype
を使用することもできます。
_stable_sort(X.rbegin(), X.rend(), [](decltype(*X.cbegin()) lhs, decltype(lhs) rhs) { return lhs.first < rhs.first; });
_
コンテナのconst正しい_value_type
_を取得するには、ここでcbegin()
を使用します。
残念ながら、auto
(const
であるかどうかに関係なく)をとる汎用ラムダは、C++ 14のみの機能です。
詳細は https://isocpp.org/wiki/faq/cpp14-language#generic-lambdas をご覧ください。
const auto
は、C++ 11ではラムダパラメーターとしてサポートされていません(実際には汎用のラムダはC++ 11ではサポートされていません)。
修正するには:
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; });
または、次のように、コンテナのvalue_type
typedefをdecltype
で直接使用することもできます。
std::stable_sort(X.rbegin(), X.rend(),
[](const decltype(X)::value_type & lhs,
const decltype(X)::value_type & rhs)
{return lhs.first < rhs.first; }
);