teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

5

とても正確なサンプルコードにしました。

2020/10/14 14:28

投稿

rocket
rocket

スコア41

title CHANGED
File without changes
body CHANGED
@@ -4,7 +4,15 @@
4
4
  sortContainer(std::vector<UnitAlignmentData>& sort, OBJ select_col)
5
5
  {
6
6
  std::sort(container.begin(), container.end(), [select_col](const AlignmentData& l, const AlignmentData& r) {
7
+
8
+ if (l.getCol() != select_col)
9
+ {
7
- return l.length > r.length;
10
+ return l.length > r.length;
11
+ }
12
+ else
13
+ {
14
+ return true;
15
+ }
8
16
  });
9
17
  }
10
18
  ```

4

調査追記

2020/10/14 14:28

投稿

rocket
rocket

スコア41

title CHANGED
File without changes
body CHANGED
@@ -55,4 +55,7 @@
55
55
  limit値を超える場合に、
56
56
  __lastの値が書き換えられていました。
57
57
 
58
- ただその詳細まで追えていません。
58
+ ただその詳細まで追えていません。
59
+
60
+ STLのバグなんでしょうか?
61
+ libc++(LLVM C++ STL with C++11 support)でした。

3

調査追記

2020/10/14 14:11

投稿

rocket
rocket

スコア41

title CHANGED
File without changes
body CHANGED
@@ -45,4 +45,14 @@
45
45
  ```
46
46
 
47
47
  ではなぜ、このようなことが起こるのでしょうか。
48
- std::sortを実行中に、他のスレッドでコンテナの操作はしていませんでした。
48
+ std::sortを実行中に、他のスレッドでコンテナの操作はしていませんでした。
49
+
50
+ ---
51
+
52
+ 以下追記です。
53
+
54
+ バックトレースからソートの実装を見ていたら
55
+ limit値を超える場合に、
56
+ __lastの値が書き換えられていました。
57
+
58
+ ただその詳細まで追えていません。

2

コード追記

2020/10/14 14:08

投稿

rocket
rocket

スコア41

title CHANGED
File without changes
body CHANGED
@@ -1,9 +1,12 @@
1
1
  以下のようなコードを書きました。
2
2
  containerは1425件格納していました。
3
3
  ```C++
4
+ sortContainer(std::vector<UnitAlignmentData>& sort, OBJ select_col)
5
+ {
4
6
  std::sort(container.begin(), container.end(), [select_col](const AlignmentData& l, const AlignmentData& r) {
5
7
  return l.length > r.length;
6
8
  });
9
+ }
7
10
  ```
8
11
 
9
12
  これが呼び出された時にエラーが出て止まったのですが、

1

調査の追記

2020/10/14 13:41

投稿

rocket
rocket

スコア41

title CHANGED
@@ -1,1 +1,1 @@
1
- (iOS、C++)stl::sort()にて、1400件のデータをソートした時、左側の引数に、コンテナの終端が渡されてきましたが、は仕様でしょうか
1
+ (iOS、C++)stl::sort()にて、1400件のデータをソートした時、左側の引数に、コンテナの終端が渡されてきましたが、原因として何が考えらでしょうか
body CHANGED
@@ -13,4 +13,33 @@
13
13
  他の部分の影響によって起こった誤動作であればよいのですが、
14
14
  まずこれは仕様なのでしょうか?
15
15
 
16
- リファレンスには特に書いてなかったのですがもし見落としていたらすみません。
16
+ リファレンスには特に書いてなかったのですがもし見落としていたらすみません。
17
+
18
+
19
+ ---
20
+
21
+ 以下追記です。
22
+
23
+ 呼び出し元を見ました。
24
+ 以下 forの条件文の所で「__i != __last」こうありますので、やはりバグのようだと思いました。
25
+ ```C++
26
+ for (_RandomAccessIterator __i = __j+1; __i != __last; ++__i)
27
+ {
28
+ if (__comp(*__i, *__j)) //<ここでエラーになってました。
29
+ {
30
+ value_type __t(_VSTD::move(*__i));
31
+ _RandomAccessIterator __k = __j;
32
+ __j = __i;
33
+ do
34
+ {
35
+ *__j = _VSTD::move(*__k);
36
+ __j = __k;
37
+ } while (__j != __first && __comp(__t, *--__k));
38
+ *__j = _VSTD::move(__t);
39
+ }
40
+ __j = __i;
41
+ }
42
+ ```
43
+
44
+ ではなぜ、このようなことが起こるのでしょうか。
45
+ std::sortを実行中に、他のスレッドでコンテナの操作はしていませんでした。