🐈

vectorの配列外参照調査

2023/11/17に公開
2
  • vector<string>の場合
int main()
{
    vector<string> s = {"test1","test2","test3"};
    string s_other = s[4]; // 空文字が出力
    cout << s_other << endl; 
    return 0;
}
  • vector<int>の場合
int main()
{
    vector<int> s = {1,2,3};
    int s_other1 = s[4];
    int s_other2 = s[1000];
    cout << s_other1 << endl; // どちらも0を出力
    cout << s_other2 << endl;
    return 0;
}

配列外参照練習問題
https://atcoder.jp/contests/abc322/tasks/abc322_a

疑問点

配列外参照でWAになるときとならない時があり違いが分からない。
手元の環境ではコンパイルエラーが出ないが、Atcoderのジャッジの際にはWAになるので、コンパイル時に配列外参照をエラーにする設定がありそう。

下記は、配列外参照でWAになったコード
43行目のループをdの個数分で回さずにnで回していた。
https://atcoder.jp/contests/abc329/submissions/47878738
https://atcoder.jp/contests/abc334/submissions/48874155

※ 追記

.vscode/task.jsonのargsの配列の中に"-fsanitize=address,undefined"を記載すればエラーにしてくれる!
https://qiita.com/boatmuscles/items/54f5e9f3eb74118e76fa

配列外参照の対応策

atだとコンパイル時にエラーが出てくれるので基本的にはatを使用してみる

https://qiita.com/deBroglieeeen/items/d5130c41e74070311a3b
https://cpprefjp.github.io/reference/vector/vector/at.html

int main()
{
    vector<int> a = {1,2,3,5};
    cout << a.at(3) << endl; // 5
    cout << a.at(4) << endl; // エラー libc++abi: terminating due to uncaught exception of type std::out_of_range: vector
    return 0;
}
	

Discussion