![](/img/trans.png)
[英]std::out_of_range exception when searching for matches in vector of strings
[英]out_of_range exception with strings
我試圖理解字符串中的out_of_range
異常
#include<iostream>
#include<exception>
using namespace std;
int main()
{
try{
string str = "Hello";
str.at(100);//throws exception and get caught
//str[100]; //this is a run time error, program crashes
}
catch (out_of_range &e)
{
cout << e.what() << endl;
}
}
為什么不對字符串進行數組訪問會引發任何異常並崩潰,而.at
可以正常工作?
IDE:VS2013
這是因為[]運算符不檢查任何內容,而at()則檢查任何內容。 CppReference說:
std :: basic_string :: at
返回對指定位置pos處字符的引用。 執行邊界檢查,無效訪問將引發類型為std :: out_of_range的異常。
std :: basic_string :: operator []
返回對指定位置pos處字符的引用。 不執行邊界檢查。
std::string::at
和std::string::operator[]
工作原理不同。
at(size_t)
方法檢查字符串的當前大小:如果字符串超出范圍,它將拋出異常。
operator[](size_t)
是對內存塊的直接訪問。 因此問題可能出在運行時。
使用長度為n的字符串s
,您可以使用[]
和at
,以明確定義的行為訪問索引0到n -1(含)之間的項。
確保通過[]
訪問索引n處的項目(1)會產生對零對象的引用,而通過at
(2)進行訪問則保證會引發out_of_range
異常。
前一種行為是為了與C編程的期望兼容,而后一種行為是為了確保正確性。
實際上,對於任何范圍從0到n -1的索引,保證at
方法可以引發out_of_range
異常。
使用[]
,您要訪問的索引(3) 必須在0到n之間 。 這意味着使用超出該范圍的索引是未定義行為。
1)關於basic_string::operator[]
C ++ 14 21.4.5 / 2:“如果pos < size()
則返回 : *(begin() + pos)
pos < size()
。 否則,返回到類型的對象的參考charT
與值charT()
其中,修改所述對象導致未定義的行為”。
2) 。 C ++ 14 21.4.6 / 5關於basic_string::at
:“如果pos >= size()
則拋出 : out_of_range
”,其中索引類型是無符號的。
3)關於basic_string::operator[]
C ++ 14 21.4.5 / 1:“ 要求 : pos <= size
。”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.