以string容器为例,容器中元素访问的方式有三种:
1.下标+[ ]运算符重载 访问元素
普通对象:char& operator[] (size_t pos)
常对象:const char& operator[] (size_t pos) const
string s1("abcdefg");
cout << s1[2] << endl;//cconst string s2("abcdefg");
cout << s2[2] << endl;//c
2.at() 访问元素
string s("abcdefg");
cout << s.at(2) << endl;//c
at访问与[ ]访问区别在于,它们对于越界的检查不同:
[ ]下标运算符不会检查越界,且不会抛出异常,需要自己做越界检查;如果越界可能会导致未定义行为,程序继续运行,但可能在某个时候奔溃,增加问题定位难度
at会额外检查是否越界,如果越界了会抛出exception异常
使用[ ]访问元素,已经越界但是程序不报错,继续运行,可能导致未定义行为在某个时候奔溃
string s("abcdefg");
cout << s[7] << endl;
使用at访问元素,at额外检查是否越界,越界抛出异常,使用catch捕获异常
string s("abcdefg");
try
{cout << s.at(7) << endl;
}
catch (const exception& e)
{cout << e.what() << endl;//invalid string position
}
3.back() 取尾元素
string s("abcdefg");
cout << s.back() << endl;//g
4.front() 取首元素
string s("abcdefg");
cout << s.front() << endl;//a