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

回答編集履歴

4

リンク追加

2020/11/24 20:28

投稿

SHOMI
SHOMI

スコア4079

answer CHANGED
@@ -16,7 +16,7 @@
16
16
  ```
17
17
 
18
18
  ---
19
- `vector`の`operator[]`は`at()`とは異なり範囲チェックについて規定されておらず、要素数以降にアクセスした場合は未定義動作です。
19
+ `vector`の[`operator[]`](https://cpprefjp.github.io/reference/vector/vector/op_at.html)[`at()`](https://cpprefjp.github.io/reference/vector/vector/at.html)とは異なり範囲チェックについて規定されておらず、要素数以降にアクセスした場合は未定義動作です。
20
20
  VisualC++付属のvector実装ではDebugビルド時には`operator[]`も範囲チェックを行っているため、Debug Assertが表示されます。
21
21
  ```C++
22
22
  _NODISCARD const _Ty& operator[](const size_type _Pos) const

3

文言修正

2020/11/24 20:28

投稿

SHOMI
SHOMI

スコア4079

answer CHANGED
@@ -17,7 +17,7 @@
17
17
 
18
18
  ---
19
19
  `vector`の`operator[]`は`at()`とは異なり範囲チェックについて規定されておらず、要素数以降にアクセスした場合は未定義動作です。
20
- VisualC++付属の実装ではDebugビルド時には`operator[]`も範囲チェックを行う実装となっているため、Debug Assertが表示されます。
20
+ VisualC++付属のvector実装ではDebugビルド時には`operator[]`も範囲チェックを行っているため、Debug Assertが表示されます。
21
21
  ```C++
22
22
  _NODISCARD const _Ty& operator[](const size_type _Pos) const
23
23
  { // subscript nonmutable sequence

2

gccについて追記

2020/11/24 20:17

投稿

SHOMI
SHOMI

スコア4079

answer CHANGED
@@ -27,4 +27,8 @@
27
27
 
28
28
  return (this->_Myfirst()[_Pos]);
29
29
  }
30
- ```
30
+ ```
31
+ ---
32
+ > ですがjoiのコードテスト(gcc)などで試すと普通に実行できます
33
+
34
+ 偶々動いているだけです。

1

範囲チェックについて追記

2020/11/24 20:15

投稿

SHOMI
SHOMI

スコア4079

answer CHANGED
@@ -13,4 +13,18 @@
13
13
  for (int j = 0; j <= 20; j++) {
14
14
  if (dp[j][i] != 0) {
15
15
  int Mx = j + v[i + 1]; // iがn-2の時にv[n-1]、つまり範囲外にアクセスしている
16
+ ```
17
+
18
+ ---
19
+ `vector`の`operator[]`は`at()`とは異なり範囲チェックについて規定されておらず、要素数以降にアクセスした場合は未定義動作です。
20
+ VisualC++付属の実装ではDebugビルド時には`operator[]`も範囲チェックを行う実装となっているため、Debug Assertが表示されます。
21
+ ```C++
22
+ _NODISCARD const _Ty& operator[](const size_type _Pos) const
23
+ { // subscript nonmutable sequence
24
+ #if _ITERATOR_DEBUG_LEVEL != 0
25
+ _STL_VERIFY(_Pos < size(), "vector subscript out of range");
26
+ #endif /* _ITERATOR_DEBUG_LEVEL != 0 */
27
+
28
+ return (this->_Myfirst()[_Pos]);
29
+ }
16
30
  ```