std :: sort应该在c ++ 0x/c ++ 11中使用lambda函数吗?

fik*_*tor 30 c++ debugging c++11

我尝试使用lambda函数sort,但是出现了"Segmentation fault"错误.我设法将代码简化为以下内容:

#include <iostream>
#include <algorithm>

int main()
{
  const int len = 18;
  int intArr[len];
  for (int i=0;i<len;i++) intArr[i]=1000+i;
  // The following is expected to sort all but the last element of the array
  std::sort(intArr, intArr + len -1, [](int a, int b)
    {
      std::cout<<"("<<a<<", "<<b<<")\n";
      return (a<b?-1:(a>b?1:0));
    });
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我使用在Ubuntu 11.04(x64)中编译并运行此代码

g++ -std=gnu++0x test2.cpp && ./a.out.

它会打印很多对形式(large_integer,1008),一对(0,1008)和退出"Segmentation fault".

ybu*_*ill 34

比较谓词应该返回一个bool:如果a <b则返回true,否则返回false.将return语句更改为:

  return a < b;
Run Code Online (Sandbox Code Playgroud)

不要将它与C风格的3向比较功能混淆.

  • 它因错误谓词而出现段错误的原因对我来说仍然是个谜。 (2认同)

Ker*_* SB 16

谓词应该实现一个简单的弱排序.如果你想对整个事物进行排序,你的范围也会关闭.(我错过了那是故意的.)总而言之,我们正在寻找这样的事情:

std::sort(intArr, intArr + nelems, [](int a, int b){ return a < b; });
Run Code Online (Sandbox Code Playgroud)

甚至:

std::sort(intArr, intArr + nelems);
Run Code Online (Sandbox Code Playgroud)

排序的默认谓词是std::less<T>,它完全与lambda一样.


Dav*_*e S 7

谓词for std::sort不采用类Java -1,0,1,而是希望你返回一个布尔值来回答问题'第一个参数是否小于第二个参数?',用于弱化元素排序.由于-1是非零值,因此排序算法认为它是真的,它会导致算法出现故障.