我在学校里被教string::at
过,但是通过探索我看到的弦乐库string::operator[]
,这是我以前从未见过的。
我现在正在使用operator[]
和从那以后没有使用at
过,但有什么区别?这是一些示例代码:
std::string foo = "my redundant string has some text";
std::cout << foo[5];
std::cout << foo.at(5);
它们在输出方面基本相同,但有一些我不知道的细微差别吗?
是的,有一个主要区别: using.at()
对传递的索引进行范围检查,如果它超出字符串的末尾,则会引发异常,而在这种情况下operator[]
只会带来未定义的行为。
at
进行边界检查,类型异常std::out_of_range
将在无效访问时抛出。
operator[]
不检查边界,因此如果您尝试访问超出字符串的边界,可能会很危险。它比at
虽然快一点。
std::string::at
返回对指定位置 pos 的字符的引用。执行边界检查,在无效访问时将抛出 std::out_of_range 类型的异常。
字符串::运算符[]
返回对指定位置 pos 的字符的引用。不执行边界检查。使用 . 越界访问是未定义的行为operator[]
。
string::operator[]
应该比std::string::at
见参考