2017-12-06 16 views
0

私は文字列のベクトルをソートする必要がありますが、それはストレートフォワードソートではありません。私は小さいベクトルサイズ(<100要素)のために完全に動作するカスタムソート関数を書いていましたが、より大きなサイズの本当に奇妙な振る舞いをします。注:入力値はすべて数値です。カスタム文字列ソート比較関数奇妙な振る舞い

いくつかのデバッグprintf文を追加して、内部で何が起こっているかを確認しました。これは、空の文字列やその他の奇妙な文字列がソートされる関数に渡されていることが分かりました。

私の予想は、ベクトルの値だけが関数に渡されるということです。ベクトルが既知の値で満たされていることを確認しました。

ソート機能:

bool sortFunc(string a, string b){  
    printf("a: %s,\tb: %s \t", a.c_str(), b.c_str()); 

    //sorting magic defining 'bool retVal' 

    printf("%s goes before %s\n", retVal?a.c_str():b.c_str(), retVal?b.c_str():a.c_str()); 

    return retVal; 
} 

主な機能:std::sortが面白い作用すると

a: 2, b: 10 2 goes before 10 
a: 10, b: 10 10 goes before 10 
a: , b: 10 goes before 10 
a: , b: 10 goes before 10 
a: \240E, b: 10 \240E goes before 10 
a: , b: 10 goes before 10 
a: {@, b: 10 {@ goes before 10 
a: , b: 10 goes before 10 
a: , b: 10 goes before 10 
a: , b: 10 goes before 10 
a: \225E, b: 10 10 goes before \225E 
a: 2, b: 10 2 goes before 10 
a: 10, b: \225E 10 goes before \225E 
a: , b:  goes before 
a: , b:  goes before 
a: \245E, b:  goes before \245E 
a: \236E, b: \245E \245E goes before \236E 
a: 0G\260\377, b: \236E 0G\260\377 goes before \236E 
a: 0G\260\377, b: \245E 0G\260\377 goes before \245E 
a: 0G\260\377, b:  0G\260\377 goes before 
+1

(A)なぜあなたは値によって文字列を受け入れていますか? (B)ソートアルゴリズムは、文字列を出入りするスクラッチスペースを持つことができます。文字列を移動すると、未知ではあるが有効な状態になります。 (C)ソートアルゴリズムが予期しているように、あなたの "魔法"が厳密な弱い秩序ではないかもしれないということがあなたに起こりましたか?未定義の振る舞いでコードを残す。 – StoryTeller

+1

ソートする前に 'ベクトル a 'を印刷するとどうなりますか?そこに「奇妙な」価値がないのは確かですか? – xander

+0

[mcve]を提供してください –

答えて

2

、それが無効であるため、比較機能のほとんど常にです:奇妙な出力の

vector<string> a(n); 
for(int i=0; i<n; ++i){ 
    cin >> a[i]; 
} 

sort(a.begin(),a.end(),sortFunc); 

サンプル。 std::sortに渡す比較関数は、の厳密な弱い順序を提供する必要があります。通常の故障は、比較関数はbba前に来る前に、すなわち、二つのオブジェクトabcompare(a,b)戻り真とcompare(b,a)戻る真のために、aが来るように定義されていることです。それが起こると、ソートアルゴリズムはデータの最後まで実行され、あらゆる種類の野性的で狂ったことを行うことがあります。

この質問に対する実際の答えは、この内部のどこかにある:

//sorting magic defining 'bool retVal' 
関連する問題