string::at和string::operator[]有什么区别?

20

我在学校里学习了string::at,但通过探索字符串库,我看到了string::operator[],这是我之前从未见过的。

现在我正在使用operator[],并且自从那时以来就没有使用过at,但两者有什么区别呢? 以下是一些示例代码:

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

就输出而言,它们基本相同,但是否存在我未意识到的一些微小差异?


3
你尝试为每个都找一个参考了吗?比较参考时应该很容易发现它们之间的区别。 - chris
2
等等,你决定在查看书籍或在线参考资料之前就从.at()切换到operator[] - us2012
嗯,我看到operator[]更快,但不知道为什么... - ayane_m
3个回答

36

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


19

at方法会进行边界检查,如果访问了无效位置,将抛出类型为std::out_of_range的异常。

operator[]方法不会检查边界,因此如果尝试访问字符串之外的位置可能会导致危险。它比at方法稍微快一些。


7

std::string::at

该函数返回指定位置pos的字符的引用。会进行边界检查,如果访问无效,则会抛出std::out_of_range类型的异常。

string::operator[]

该函数返回指定位置pos的字符的引用。不进行边界检查,使用operator[]访问越界是未定义行为。

string::operator[]std::string::at略快。

请参考参考文献


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接