初识迭代器
一、为什么用迭代器
要访问string和容器中的元素,可以通过下标运算符实现。但是只有少数容器实现了下标访问,所以需要一个更为通用的方式来访问,就引入了迭代器(iterator)。从这一点上看,迭代器和指针类似。
二、迭代器的运算符
操作符名称 | 作用 |
---|---|
*iter | 返回迭代器所指向元素的引用 |
iter->men | 解引用iter并获取men成员 |
++iter | 令iter指示容器的下一个元素 |
--iter | 令iter指示容器的上一个元素 |
iter1 == iter2 | 判断迭代器是否相等,如果指向的是同一个元素或者都为尾后迭代器(end之后为空),则相等 |
iter1 != iter2 | 否则不相等 |
举例使用
将string对象中小写改为大写,碰见第一个空白或者字符串完毕后停止。
int main()
{
string s{"some string"};
for(auto it = s.begin(); it != s.end() && !isspace(*it); it++)
{
*it = toupper(*it);
}
return 0;
}
三、迭代器的定义
1、正向迭代器
容器类名::iterator 迭代器名;
2、常量正向迭代器
容器类名::const_iterator 迭代器名;
四、迭代器的类型
使用Iterator和const_iterator来表示迭代器的类型
vector<int>::iterator it;
vector<int>::const_iterator it2; //it2只能读元素
五、begin 和 end 运算符
begin和end具体类型取决于对象是否是常量
vector<int> a;
const vector<int> b;
auto it = a.begin(); //it类型为vector<int>::iterator
auto it2 = b.end(); //it2类型为vector<int>::const_iterator
为了只读我们可以使用cbegin 和 cend
vector<int> a;
auto it = a.cbegin(); //it类型为vector<int>::const_iterator
六、迭代器失效
以后
七、迭代器运算
运算 | 作用 |
---|---|
iter + n | 前移n个元素,或者指向尾元素的下一个位置 |
iter - n | 后移n个元素,或者指向尾元素的下一个位置 |
iter1 += n | 同上,结果保存回iter1 |
iter1 -= n | 同上,将结果保存回iter1 |
iter1 - iter2 | 得到两个迭代器的距离,iter1和iter2必须是同一个容器的元素,或者是尾元素的下一位置 |
> >= < <= | 判断迭代器的位置,在后面的大 |
diffenernce_type是带符号整数,可以保存两个迭代器相减的距离
vector<int> a;
a.push_back(10);
a.push_back(9);
vector<int>::iterator it;
auto len = a.begin() - a.end();
//auto是difference_type类型