vector<int> intV = { 1,2,3 };
//返回元素
//1、back()
int last = intV.back();
cout <<"last = "<< last << endl;
//2、获取长度来访问最后一个单元
int last_2 = intV[intV.size() - 1];
cout <<"last_2 = "<< last_2 << endl;
//返回迭代器
//3、.end()-1
vector<int>::iterator it = intV.end() - 1;
cout <<"*it = " <<*it << endl;
//4、.rbegin();
vector<int>::reverse_iterator r_it = intV.rbegin();
cout << "*r_it = "<<*r_it << endl;
这里第一个方法会出错,出错提示:
使用front()返回第一个元素试试啥结果:
int first = intV.front();
cout << "frist = " << first << endl;
成功输出第一个元素:
为什么会这样?
分析back()和front()的源码:
//back()
_NODISCARD _Ty& back() {
auto& _My_data = _Mypair._Myval2;
#if _CONTAINER_DEBUG_LEVEL > 0
_STL_VERIFY(_My_data._Myfirst != _My_data._Mylast, "back() called on empty vector");
#endif // _CONTAINER_DEBUG_LEVEL > 0
return _My_data._Mylast[-1];
}
//front()
_NODISCARD _Ty& front() {
auto& _My_data = _Mypair._Myval2;
#if _CONTAINER_DEBUG_LEVEL > 0
_STL_VERIFY(_My_data._Myfirst != _My_data._Mylast, "front() called on empty vector");
#endif // _CONTAINER_DEBUG_LEVEL > 0
return *_My_data._Myfirst;
}
可以看到两个函数返回值都是值类型,分析到这儿,才发现原来是测试上上面已经定义过了last,
这句话造成了错误,引发了重定义,闹了乌龙。修改这个bug后就成功输出了。
但back()的这句源码return _My_data._Mylast[-1];
也引发了我的思考,是否可以通过.end()[-1]来取得vector最后一个元素?试一下
答案是可以,因此方法又多了一种
//5、.end()[-1];
int last_3 = intV.end()[-1];
cout << "last_3 = " << last_3 << endl;
不仅如此,.end()[-i]可以返回倒数第i个元素,又是个新的知识。