私は文字列のベクトルをソートする必要がありますが、それはストレートフォワードソートではありません。私は小さいベクトルサイズ(<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
(A)なぜあなたは値によって文字列を受け入れていますか? (B)ソートアルゴリズムは、文字列を出入りするスクラッチスペースを持つことができます。文字列を移動すると、未知ではあるが有効な状態になります。 (C)ソートアルゴリズムが予期しているように、あなたの "魔法"が厳密な弱い秩序ではないかもしれないということがあなたに起こりましたか?未定義の振る舞いでコードを残す。 – StoryTeller
ソートする前に 'ベクトル a 'を印刷するとどうなりますか?そこに「奇妙な」価値がないのは確かですか? –
xander
[mcve]を提供してください –