C++基础之迭代器iterator
C++基础之迭代器iterator
我们已经知道可以使用下标运算符来访问string
对象的字符或vector
对象的元素,还有另一种更通用的机制也可以实现同样的目的,这就是迭代器(iterator)
。
标准库容器都可以使用迭代器,但是只有少数几种才同时支持下标运算符。
类似于指针类型,迭代器
也提供了对对象
的间接访问。就迭代器而言,其对象是容器中的元素或者string对象中的字符。使用迭代器可以访问某一个元素,迭代器也能从一个元素移动到另外一个元素。迭代器和指针一样,有无效和有效的区别。
有效的迭代器指向元素或者尾元素的下一个位置,其他情况都属于无效的迭代器。
使用迭代器
能够使用迭代器的变量类型拥有返回迭代器的方法。
begin()
方法负责返回指向第一个元素
的迭代器
end()
方法负责返回指向容器尾元素的下一个位置
的迭代器
// b表示v的第一个元素,e表示v尾元素的下一个位置
auto b = v.begin(), e = v.end(); // b和e的类型相同
特殊情况下:
如果容器为空,则
begin
和end
返回的是同一个迭代器。
迭代器运算符
运算符 | 含义 |
---|---|
*iter | 返回迭代器iter所指元素的引用 |
iter->mem | 解引用iter并获取该元素的名为mem的成员,等价于*(iter).mem |
++iter | 令iter指向容器中的下一个元素 |
--iter | 令iter指向元素中的上一个元素 |
iter1 == iter2 | 判断两个迭代器是否相等 |
这使得迭代器就想下标一样的好用,比如:
string s("come thing");
if (s.begin() != s.end()) {
auto it = s.begin();
*it = toupper(*it);
}
迭代器类型
就想不知道string
和vector
的site_type
成员到底是什么类型一样,一般来说我们也不知道迭代器的精确类型。而实际上,那些拥有迭代器的标准库类型都会使用iterator
和const_iterator
来表示迭代器的类型:
vector<int>::iterator it; // it能代表vector<int>的元素
string::iterator it2; // it2能代表string对象中的元素
vector<int>::const_iterator it3; // it3只能代表读元素,不能代表写元素
string::const_iterator it4; // it4只能读字符,不能写字符,即改变字符的值
const_iterator
和常量指针差不多,能读取但不能修改他所指元素的值。
如果vector对象或string对象是一个常量,只能使用
const_iterator
结合解引用和成员访问操作
解引用可以获得迭代器所指的对象,如果该对象的类型恰好是个类,就有可能进一步访问他的成员。例如:
vector<string> strs = {"string", "", "tingyugetc"};
for (auto it = strs.begin(); it != strs.end() ; ++it) {
if (it->empty()) {
cout << "now is in empty string" << endl;
}
}
上述的代码中使用了箭头运算符
, 箭头运算符将解引用和成员访问两个操作结合在一起,他的作用和(*it).empty()
相同。
(*it).empty()
的圆括号必不可少,其含义是先执行括号内的解引用,接着解引用的结果在执行点运算符。如果不加括号,那么点运算符将由it执行,而不是it解引用的结果。
迭代器失效
某些对vector对象的操作会使迭代器失效.
谨记,但凡使用了迭代器的循环体,都不要想迭代器所属的容器添加元素
迭代器的运算
迭代器的递增运算令迭代器每次移动一个元素,所有的标准库都有支持递增运算符的迭代器。类似的,也能用==
和!=
对任意标准库类型的两个有效迭代器进行比较。
同样的,可以令迭代器和一个整数值相加或相减,其返回值是向前或向后移动了若干个位置的迭代器,执行这样的操作时,结果迭代器要么指向原vector对象内的一个元素要么指向尾元素的下一个位置。
比如,可以这样:
// 计算得到最接近vi中间元素的一个迭代器
auto mid = vi.begin() + vi.size() / 2;
使用迭代器运算的一个经典算法是二分搜索。
auto beg = text.begin(), end = text.end();
auto mid = beg + (end - beg) / 2;
while (mid != end && *mid != found) {
if (found < *mid) {
end = mid;
} else {
beg = mid + 1;
}
mid = beg + (end - beg) / 2;
}
C++基础之迭代器iterator的更多相关文章
- java基础知识5--集合类(Set,List,Map)和迭代器Iterator的使用
写的非常棒的一篇总结: http://blog.csdn.net/speedme/article/details/22398395#t1 下面主要看各个集合如何使用迭代器Iterator获取元素: 1 ...
- [oldboy-django][5python基础][高级特性]Iterator迭代器
# 区分可迭代对象iterable, 迭代器iterator, 生成器generator a. iterable 可直接用for循环的对象,都称为可迭代对象, from collections imp ...
- C++迭代器 iterator【转】
1. 迭代器(iterator)是一中检查容器内元素并遍历元素的数据类型.(1) 每种容器类型都定义了自己的迭代器类型,如vector:vector<int>::iterator iter ...
- C++迭代器 iterator
1. 迭代器(iterator)是一中检查容器内元素并遍历元素的数据类型.(1) 每种容器类型都定义了自己的迭代器类型,如vector:vector<int>::iterator iter ...
- 用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。
最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变 ...
- VC++ 迭代器 iterator, const_iterator, const iterator
迭代器 iterator, const_iterator, const iterator 迭代器iterator的作用类似于指针. (1)iterator只有针对制定<类型>的容器才有效. ...
- 迭代器iterator
现在接着上篇的,写一来标识vector 的元素的对象迭代器iterator: 还是通过具体代码举例: 下面我讲了一个我暑期团队的故事哦~~: #include<iostream> #inc ...
- c++中的迭代器 iterator
迭代器iterator的作用类似于指针. iterator只有针对制定<类型>的容器才有效.例如: vector<int> vec; vector<int>::it ...
- Python的迭代器(iterator)和生成器(constructor)
一.迭代器(iterator) 1.迭代器的概述 在Python中,for循环可以用于Python中的任何类型,包括列表.元祖等等,实际上,for循环可用于任何“可迭代对象”,这其实就是迭代器 迭代器 ...
随机推荐
- C++ 中字符串查找、字符串截取、字符串替换
参照:C++基础-string截取.替换.查找子串函数 1.字符串查找 s.find(s1) //查找s中第一次出现s1的位置,并返回(包括0) s.rfind(s1) //查找s中最后次出现s1的位 ...
- 剑指offer 面试题. 数据流中的中位数
题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值.我们 ...
- 经常犯的错误之递归写不全return
在写递归函数的时候,只在最后一层写return,中间的过程没有return,导致结果的丢失. 举个例子 LL query(LL i, LL k) { if (sum[i] < k) { ; } ...
- win32 用户自定义消息范围
WINDOWS自定义消息WM_USER和WM_APP WM_USER常量是Windows帮助应用程序定义私有窗口类里的私有消息,通常使用WM_USER+一个整数值,但总值不能超过0x7FFF. #de ...
- laravel环境安装
参考 https://blog.csdn.net/xiaomayi721025/article/details/84727405 环境准备
- HTML的链接标签
网页的链接标签 文本超链接 图像超链接 格式:<a href="path" target="目标窗口位置" >链接文本或图像</a> 锚 ...
- 【译】通过 Rust 学习解析器组合器 — Part 1
原文地址:Learning Parser Combinators With Rust 原文作者:Bodil 译文出自:掘金翻译计划 本文永久链接:https://github.com/xitu/gol ...
- ES6新的数据类型 generato,在AJAX中的应用
1.next()方法会执行generator的代码,然后,每次遇到yield x;就返回一个对象{value: x, done: true/false},然后“暂停”.返回的value就是yield的 ...
- Bootstrap入门(1)简介
作者:赵盼盼 出处:https://www.cnblogs.com/zhaopanpan/ Bootstrap是Twitter开源的基于HTML.CSS.JavaScript的前端框架. 它是为实现快 ...
- 973. 最接近原点的 K 个点
1.暴力排序,新建节点类重载小于符号排序. class Solution { public: struct comb{ int index,distance; comb():index(0),dist ...