如何在 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.

你基本上有两个选择:

  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 基本上是如何在幕后实现的。 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; }
                );