When should I use vector::at instead of vector::operator[]?

c++, stdvector, stl

Solution

I'd say the exceptions that `vector::at()` throws aren't really intended to be caught by the immediately surrounding code. They are mainly useful for catching bugs in your code. If you need to bounds-check at runtime because e.g. the index comes from user input, you're indeed best off with an `if` statement. So in summary, design your code with the intention that `vector::at()` will never throw an exception, so that if it does, and your program aborts, it's a sign of a bug. (just like an `assert()`)

Problem

I know that `at()` is slower than `[]` because of its boundary checking, which is also discussed in similar questions like C++ Vector at/[] operator speed or ::std::vector::at() vs operator[] << surprising results!! 5 to 10 times slower/faster!. I just don't understand what the `at()` method is good for. If I have a simple vector like this one: `std::vector<int> v(10);` and I decide to access its elements by using `at()` instead of `[]` in situation when I have a index `i` and I'm not sure if its in vectors bounds, it forces me to wrap it with try-catch block: ``` try { v.at(i) = 2; } catch (std::out_of_range& oor) { ... } ``` although I'm able to do the get the same behaviour by using `size()` and checking the index on my own, which seems easier and much convenient for me: ``` if (i < v.size()) v[i] = 2; ``` So my question is: What are advantages of using vector::at over vector::operator[] ? When should I use vector::at rather than vector::size + vector::operator[] ?

Original source

Related problems