質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

STL

STL(Standard Template Library)は、ジェネティックコンテイナー、イテレーター、アルゴリズム、そして関数オブジェクトのC++ライブラリーです。

Q&A

解決済

(iOS、C++)stl::sort()にて、1400件のデータをソートした時、左側の引数に、コンテナの終端が渡されてきましたが、原因として何が考えられるでしょうか。

rocket
rocket

総合スコア41

C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

STL

STL(Standard Template Library)は、ジェネティックコンテイナー、イテレーター、アルゴリズム、そして関数オブジェクトのC++ライブラリーです。

1回答

0グッド

0クリップ

383閲覧

投稿2020/10/14 13:30

編集2020/10/14 14:28

以下のようなコードを書きました。
containerは1425件格納していました。

C++

1sortContainer(std::vector<UnitAlignmentData>& sort, OBJ select_col) 2{ 3 std::sort(container.begin(), container.end(), [select_col](const AlignmentData& l, const AlignmentData& r) { 4 5 if (l.getCol() != select_col) 6 { 7 return l.length > r.length; 8 } 9 else 10 { 11 return true; 12 } 13 }); 14}

これが呼び出された時にエラーが出て止まったのですが、
引数”l”を調べたところ、どうやら、containerの終端(end)のようでした。

いままで、ここに終端が渡されて来たことがなかったので気になっています。
他の部分の影響によって起こった誤動作であればよいのですが、
まずこれは仕様なのでしょうか?

リファレンスには特に書いてなかったのですがもし見落としていたらすみません。


以下追記です。

呼び出し元を見ました。
以下 forの条件文の所で「__i != __last」こうありますので、やはりバグのようだと思いました。

C++

1 for (_RandomAccessIterator __i = __j+1; __i != __last; ++__i) 2 { 3 if (__comp(*__i, *__j)) //<ここでエラーになってました。 4 { 5 value_type __t(_VSTD::move(*__i)); 6 _RandomAccessIterator __k = __j; 7 __j = __i; 8 do 9 { 10 *__j = _VSTD::move(*__k); 11 __j = __k; 12 } while (__j != __first && __comp(__t, *--__k)); 13 *__j = _VSTD::move(__t); 14 } 15 __j = __i; 16 }

ではなぜ、このようなことが起こるのでしょうか。
std::sortを実行中に、他のスレッドでコンテナの操作はしていませんでした。


以下追記です。

バックトレースからソートの実装を見ていたら
limit値を超える場合に、
__lastの値が書き換えられていました。

ただその詳細まで追えていません。

STLのバグなんでしょうか?
libc++(LLVM C++ STL with C++11 support)でした。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

1

ベストアンサー

sortに渡してる比較関数が正しく順序付けてきてないせいでしょう。

変数名getCol()length
a!=select_col1
b==select_col0
c!=select_col2

こんな変数があったとして、sortに渡した比較関数でソートするとどうなるか考えてみてください。
おそらくselect_colを先頭に持ってきて、それ以外を長さの降順に並べようとしてるのだと思います。その場合[b, c, a]が正しい順序ですが、それ以外にも[a, b, c]、[c, b, a]、[c, a, b]といった並びでも隣り合う項を比較するとソート済みになっています。

投稿2020/10/14 17:37

yudedako67

総合スコア2045

rocket👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

rocket

2020/10/15 01:48 編集

ありがとうございます。 全くそのとおりでした。 Compareオブジェクトに必須の要件を満たしていない、 書いていただいた表から [a, b] と [b, a] 成り立つ事など、 考え落ちしていたことがよく分かりました。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

STL

STL(Standard Template Library)は、ジェネティックコンテイナー、イテレーター、アルゴリズム、そして関数オブジェクトのC++ライブラリーです。