質問編集履歴

5

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

2020/10/14 14:28

投稿

rocket
rocket

スコア41

test CHANGED
File without changes
test CHANGED
@@ -10,7 +10,23 @@
10
10
 
11
11
  std::sort(container.begin(), container.end(), [select_col](const AlignmentData& l, const AlignmentData& r) {
12
12
 
13
+
14
+
15
+ if (l.getCol() != select_col)
16
+
17
+ {
18
+
13
- return l.length > r.length;
19
+ return l.length > r.length;
20
+
21
+ }
22
+
23
+ else
24
+
25
+ {
26
+
27
+ return true;
28
+
29
+ }
14
30
 
15
31
  });
16
32
 

4

調査追記

2020/10/14 14:28

投稿

rocket
rocket

スコア41

test CHANGED
File without changes
test CHANGED
@@ -113,3 +113,9 @@
113
113
 
114
114
 
115
115
  ただその詳細まで追えていません。
116
+
117
+
118
+
119
+ STLのバグなんでしょうか?
120
+
121
+ libc++(LLVM C++ STL with C++11 support)でした。

3

調査追記

2020/10/14 14:11

投稿

rocket
rocket

スコア41

test CHANGED
File without changes
test CHANGED
@@ -93,3 +93,23 @@
93
93
  ではなぜ、このようなことが起こるのでしょうか。
94
94
 
95
95
  std::sortを実行中に、他のスレッドでコンテナの操作はしていませんでした。
96
+
97
+
98
+
99
+ ---
100
+
101
+
102
+
103
+ 以下追記です。
104
+
105
+
106
+
107
+ バックトレースからソートの実装を見ていたら
108
+
109
+ limit値を超える場合に、
110
+
111
+ __lastの値が書き換えられていました。
112
+
113
+
114
+
115
+ ただその詳細まで追えていません。

2

コード追記

2020/10/14 14:08

投稿

rocket
rocket

スコア41

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

1

調査の追記

2020/10/14 13:41

投稿

rocket
rocket

スコア41

test CHANGED
@@ -1 +1 @@
1
- (iOS、C++)stl::sort()にて、1400件のデータをソートした時、左側の引数に、コンテナの終端が渡されてきましたが、は仕様でしょうか
1
+ (iOS、C++)stl::sort()にて、1400件のデータをソートした時、左側の引数に、コンテナの終端が渡されてきましたが、原因として何が考えらでしょうか
test CHANGED
@@ -29,3 +29,61 @@
29
29
 
30
30
 
31
31
  リファレンスには特に書いてなかったのですがもし見落としていたらすみません。
32
+
33
+
34
+
35
+
36
+
37
+ ---
38
+
39
+
40
+
41
+ 以下追記です。
42
+
43
+
44
+
45
+ 呼び出し元を見ました。
46
+
47
+ 以下 forの条件文の所で「__i != __last」こうありますので、やはりバグのようだと思いました。
48
+
49
+ ```C++
50
+
51
+ for (_RandomAccessIterator __i = __j+1; __i != __last; ++__i)
52
+
53
+ {
54
+
55
+ if (__comp(*__i, *__j)) //<ここでエラーになってました。
56
+
57
+ {
58
+
59
+ value_type __t(_VSTD::move(*__i));
60
+
61
+ _RandomAccessIterator __k = __j;
62
+
63
+ __j = __i;
64
+
65
+ do
66
+
67
+ {
68
+
69
+ *__j = _VSTD::move(*__k);
70
+
71
+ __j = __k;
72
+
73
+ } while (__j != __first && __comp(__t, *--__k));
74
+
75
+ *__j = _VSTD::move(__t);
76
+
77
+ }
78
+
79
+ __j = __i;
80
+
81
+ }
82
+
83
+ ```
84
+
85
+
86
+
87
+ ではなぜ、このようなことが起こるのでしょうか。
88
+
89
+ std::sortを実行中に、他のスレッドでコンテナの操作はしていませんでした。