web-dev-qa-db-ja.com

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; });
26
A. John

C++ 11は汎用ラムダをサポートしていません。それが、ラムダのパラメーターリストのautoが実際に表すものです:関数テンプレートのパラメーターに匹敵するジェネリックパラメーター。 (constはここでは問題ではないことに注意してください。)

注:C++ 14doesは、autoconst autoなど。あなたはそれについて読むことができます ここ

基本的に2つのオプションがあります

  1. 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; });
    
  2. ラムダを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());
    
29
leemes

受け入れられた答えがあることは知っていますが、これには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()を使用します。

11
Nim

残念ながら、autoconstであるかどうかに関係なく)をとる汎用ラムダは、C++ 14のみの機能です。

詳細は https://isocpp.org/wiki/faq/cpp14-language#generic-lambdas をご覧ください。

9
Rich L

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; });
3
utnapistim

または、次のように、コンテナの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; }
                );
2
vsoftco