🐈
vectorの配列外参照調査
- 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;
}
配列外参照練習問題
疑問点
配列外参照でWAになるときとならない時があり違いが分からない。
手元の環境ではコンパイルエラーが出ないが、Atcoderのジャッジの際にはWAになるので、コンパイル時に配列外参照をエラーにする設定がありそう。
下記は、配列外参照でWAになったコード
43行目のループをdの個数分で回さずにnで回していた。
※ 追記
.vscode/task.jsonのargsの配列の中に"-fsanitize=address,undefined"を記載すればエラーにしてくれる!
配列外参照の対応策
atだとコンパイル時にエラーが出てくれるので基本的にはatを使用してみる
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
std::vector
の[]
演算子で範囲外にアクセスしようとした結果は未定義です。 意味のある結果は期待できません。0
や空文字列が返っているように見えても保証された動作ではありませんし、常にそうなるとも限りません。ありがとうございます、基本的にはatを使用してみます🙇