15

我在学校里被教string::at过,但是通过探索我看到的弦乐库string::operator[],这是我以前从未见过的。

我现在正在使用operator[]和从那以后没有使用at过,但有什么区别?这是一些示例代码:

std::string foo = "my redundant string has some text";
std::cout << foo[5];
std::cout << foo.at(5);

它们在输出方面基本相同,但有一些我不知道的细微差别吗?

4

3 回答 3

30

是的,有一个主要区别: using.at()对传递的索引进行范围检查,如果它超出字符串的末尾,则会引发异常,而在这种情况下operator[]只会带来未定义的行为

于 2013-02-05T02:16:15.213 回答
17

at 进行边界检查,类型异常std::out_of_range将在无效访问时抛出。

operator[] 不检查边界,因此如果您尝试访问超出字符串的边界,可能会很危险。它比at虽然快一点。

于 2013-02-05T02:16:16.727 回答
6

std::string::at

返回对指定位置 pos 的字符的引用。执行边界检查,在无效访问时将抛出 std::out_of_range 类型的异常。

字符串::运算符[]

返回对指定位置 pos 的字符的引用。不执行边界检查。使用 . 越界访问是未定义的行为operator[]

string::operator[]应该比std::string::at

参考

于 2013-02-05T02:16:36.923 回答