开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情
3.4.1 使用迭代器
//be类型由编译器决定
//b表示v的第一个元素, e表示v尾元素的下一位置
auto b = v.begin(), e = end(); //b e 类型相同
特殊情况下如果容器为空,则begin和end返回同一个迭代器
标准容器迭代器的运算符
| *iter | 返回迭代器iter所指元素的引用 |
|---|---|
| iter->mem | 解引用iter并获取该元素的名为mem的成员,等价于*(iter).mem |
| ++iter | 令iter指示容器中下一个元素 |
| --iter | 令iter指示容器中上一个元素 |
| iter1 == iter2 | 两个迭代器相等,返回1 |
| iter != iter2 | 不相等返回1 |
注意:end返回的迭代器并不实际指示某一个元素,所以不能对其进行递增或解引用的操作
迭代器的类型分为:iterator, const_iterator。其中const_iterator只能读不能写
begin和end返回的具体类型由对象是否是常量决定
const vector<int> cv;
auto it1 = cv.begin(); //it1的类型是const_iterator
vector<int> v;
auto it2 = v.cbegin();//it2的类型是const_iterator 不论v是不是常量
对于成员访问操作,在实际使用中遇到以下问题,在这里标记记录一下
vector<string> str{"helloworld"};
auto itStr = str.begin();
if (itStr->empty()) cout << "空" << endl;
//对于vector<int>的迭代器,不可以使用empty
vector<int> nums{1,2,3,4};
auto itNums = nums.begin();
if (itNums->empty()) cout << "空" << endl; //err
警告:但凡是使用了迭代器的循环体,都不可以向迭代器所属的容器添加元素因为一旦改变了vector对象容量,都会使vector对象的迭代器失效。
3.4.2 迭代器的运算
只要两个迭代器指向的是同一个容器中的元素或者尾元素的下一位置,就能将其相减。所得的结果是两个迭代器之间的距离。
距离的类型名是difference_type的带符号整数型,这是值得注意的一点