如何在C 中使用Lambda自动参数

How to use lambda auto parameters in C++11

本文关键字:Lambda 参数      更新时间:2023-10-16

我在C 中有一个代码。但是,当我在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不是这里的问题。)

注意:c 14 die autoconst auto等支持Lambdas。您可以在此处阅读有关它的信息。

您基本上有两个选项:

  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. 用具有调用操作员模板的函数替换lambda。这就是通用兰巴斯基本在现场实施的方式。Lambda非常通用,因此请考虑将其放在一些全球公用事业标题中。(但是,请勿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; });

当您获得容器的句子正确value_type时,请在此处使用cbegin()

不幸的是,服用auto(是否const)的通用lambdas仅是C 14功能。

请参阅此处https://isocpp.org/wiki/faq/cpp14-language#generic-lambdas,以获取更多详细信息。

另外,您可以直接使用具有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; }
                );

const auto在C 11中不支持lambda参数(C 11中不支持通用lambdas)。

修复:

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