c++11使用lambda排序列表

c++11 sorting list using lambda

本文关键字:列表 排序 lambda 使用 c++11      更新时间:2023-10-16

在练习lambdas的使用时,我编写了这个程序,该程序应该根据pair s的第二个元素(int)对list进行排序。

<>之前# include & lt; iostream># include & lt; algorithm># include & lt; list>使用命名空间std;int main (){List<string,>>s ={{"two"2},{"人,1},{"three"3}};sort (s.begin (), s.end (), [] (pair<字符串,int>A、pair<string;b)→bool>(b.second);});s.end for_each (s.begin () (), [] (pair<字符串,int>一){cout & lt; & lt;a.first & lt; & lt;";";& lt; & lt;a.second & lt; & lt;endl;});}之前

我得到这些错误:

c:qtqt5.2.0toolsmingw48_32libgcci686-w64-mingw324.8.0includec++bitsstl_algo.h:5513: error: no match for 'operator-' (operand types are 'std::_List_iterator<std::pair<std::basic_string<char>, int> >' and 'std::_List_iterator<std::pair<std::basic_string<char>, int> >')
     std::__lg(__last - __first) * 2, __comp);
                  ^
c:qtqt5.2.0toolsmingw48_32libgcci686-w64-mingw324.8.0includec++bitsstl_algo.h:2245: ошибка: 'void std::__final_insertion_sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = std::_List_iterator<std::pair<std::basic_string<char>, int> >; _Compare = main()::__lambda0]', declared using local type 'main()::__lambda0', is used but never defined [-fpermissive]
     __final_insertion_sort(_RandomAccessIterator __first,
     ^

我的代码有什么问题?

您可能不能将std::sort与顺序容器(如std::liststd::forward_list)一起使用,因为它们没有标准算法std::sort所需的随机访问迭代器。因此,这两个容器都有自己的成员函数sort。

在这种情况下,代码看起来像这样:

#include <iostream>
#include <list>
#include <string>
using namespace std;
int main()
{
    list<pair <string, int>> s = {{"two", 2}, {"one", 1}, {"three", 3}};
    s.sort( []( const pair<string,int> &a, const pair<string,int> &b ) { return a.second > b.second; } );
    for ( const auto &p : s )
    {
        cout << p.first << " " << p.second << endl;
    }
}

考虑到你需要包含头文件<string>,否则你的程序将不会被其他编译器编译。

std::sort需要随机访问迭代器,而std::list没有。但是你可以用std::list::sort代替。

s.sort([](const pair<string,int>& a, const pair<string,int>& b)
       {
         return (a.second) > (b.second);
       });

,我在其中创建了谓词const引用的参数,因为不需要复制它们,这样做可能会产生一些不必要的开销。