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

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

新規登録して質問してみよう
ただいま回答率
85.35%
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

解決済

1回答

762閲覧

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

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++ライブラリーです。

0グッド

0クリップ

投稿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)でした。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

総合スコア2047

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rocket

2020/10/15 01:48 編集

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問