The statement about std::vector is... mostly wrong.
http://www.cplusplus.com/reference/stl/vector/operator%5B%5D/
operator[] does not do a runtime check, and will result in code that potentially segfaults if you do an out of bounds array access (similar to doing the same thing with a C-style array. The "at" function will throw an exception and signal an error.
This isn't to say that you shouldn't use operator[]. I use it all the time, because I often already know the size of the array (I use iterators far more often than operator[] though). The fact that there is no check is one of the advantages of C++, as in Java, there is always a check that can't be disabled (thus effecting speed).
You'll also notice this function returns a reference, not a pointer. It's impossible to pass a NULL with a reference in C++. No matter how you look at it, it's impossible for an access to a vector to return NULL. You either have "at", which throws an exception, or operator[], which gives you junk.
As C++ is a systems language, this is fine and expected. As an application level language, this is unacceptable.
The argument, "Look! I can do this and it's bad!" is because it's perfectly possible for the greatest programmer in the world to have an off-day and mess up. It's just a part of being human. It's nice when the programming language makes messing up harder to do, which C++ does not do well. That's why people say C++ is bad. The only current problem is that for the systems-level domain of highly efficient code, there aren't a whole lot of choices.