2011-10-14 4 views
30

sortでラムダ関数を使用しようとしましたが、「セグメンテーションフォールト」エラーが発生していました。私は、次のコードを簡素化するために管理:std :: sortはC++でラムダ関数で動作する必要がありますか?0x/C++ 11?

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

私は

g++ -std=gnu++0x test2.cpp && ./a.outを使用してのUbuntu 11.04(x64)の中で、このコードをコンパイルして実行します。

形式(large_integer、1008)、数(0,1008)のペアが多数印刷され、「セグメンテーションフォルト」で終了します。

+4

ちょうど発言として、コードで最初の17要素をソートするだけです。 –

+5

はい。この事実はコードの唯一のコメントに書かれています。 – fiktor

+0

@KerrekSB: "//以下は、配列の最後の要素以外のすべてをソートすると予想されます。" – Griwes

答えて

33

比較述部は、< bの場合はbool:trueを返し、そうでない場合はfalseを返します。返信ステートメントを次のように変更してください。

return a < b; 

Cスタイルの3方向比較関数と混同しないでください。

+0

ありがとうございます。確かに私は間違っていた。 a fiktor

+1

それは、間違った述語でsegfaultsする理由はまだ私には謎です。 –

+1

@NilsPipenbrinck:コンパレータが厳密な弱い順序を与えない場合、 'std :: sort'は未定義の振る舞いをします。セグメンテーションが起こる可能性は予期せぬことではありません。 – Mankarse

16

述語は単純で弱い順序を実装することになっています。 全体をソートする場合は、範囲もオフです。は(私はそれが意図的であったことを逃した。)したがって、すべてのすべてで、我々はこのような何かを探している:

std::sort(intArr, intArr + nelems, [](int a, int b){ return a < b; }); 

あるいは:

std::sort(intArr, intArr + nelems); 

ソートのデフォルトの述語はstd::less<T>あり、いまさにラムダがしていること。

6

std::sortの述語はJavaのような形ではありませんが、代わりに「第1引数が第2引数よりも小さいか」という質問に答えるブール値を返すことを望みます。要素。 -1はゼロ以外の値であるため、ソートアルゴリズムによって真と見なされ、アルゴリズムが故障します。

+1

"//以下は配列の最後の要素以外のすべてをソートすると期待されています" – Griwes

+0

@Griwes Huh?これはどのように答えに関連していますか? –

+0

@Christian:彼のコードでコメントを忘れた、以前の編集がありました。私は私の答えからそれを削除しました。私がやる前にグリブスがそれを捕まえたようだ。 –

関連する問題