C/C++迭代器使用具体解释
迭代器是一种检查容器内元素并遍历元素的数据类型。能够替代下标訪问vector对象的元素。
每种容器类型都定义了自己的迭代器类型,如 vector:
vector<int>::iterator iter;
这符语句定义了一个名为 iter 的变量。它的数据类型是 vector<int> 定义的 iterator 类型。每一个标准库容器类型都定义了一个名为 iterator 的成员,这里的 iterator 与迭代器实际类型的含义同样。
begin 和 end 操作
vector<int>::iterator iter = ivec.begin();
上述语句把 iter 初始化为由名为 vector 操作返回的值。如果 vector 不空,初始化后,iter 即指该元素为 ivec[0]。
由 end 操作返回的迭代器指向 vector 的“末端元素的下一个”。表明它指向了一个不存在的元素。如果 vector 为空。begin 返回的迭代器与 end 返回的迭代器同样。由 end 操作返回的迭代器并不指向 vector 中不论什么实际的元素,相反,它仅仅是起一个哨兵(sentinel)的作用。表示我们已处理完 vector
中全部元素。
】
vector 迭代器的自增和解引用运算
*iter = 0;
解引用操作符返回迭代器当前所指向的元素。如果 iter 指向 vector 对象 ivec 的第一元素,那么 *iter 和 ivec[0] 就是指向同一个元素。上面这个语句的效果就是把这个元素的值赋为 0。
迭代器使用自增操作符向前移动迭代器指向容器中下一个元素。从逻辑上说。迭代器的自增操作和 int 型对象的自增操作类似。对 int 对象来说。操作结果就是把 int 型值“加 1”,而对迭代器对象则是把容器中的迭代器“向前移动一个位置”。因此,假设 iter 指向第一个元素,则 ++iter 指向第二个元素。
迭代器的其它操作
迭代器应用的程序演示样例
1、使用迭代器和下标改变vector的内容
#include <iostream>
#include <string>
#include <vector> int print_int_vector(std::vector<int> ivec)
{
for(std::vector<int>::size_type ix =0, j = 0; ix != ivec.size(); ++ix, ++j)
{
std::cout<<ivec[ix]<<" "; //加空格!
}
std::cout<<std::endl;
return 0;
} int main()
{
std::vector<int> ivec(10, 68); // empty vector
print_int_vector(ivec);
// reset all the elements in ivec to 0
/*
// 使用下标
for (std::vector<int>::size_type ix = 0; ix != ivec.size(); ++ix)
{
ivec[ix] = 0;
}
*/
// equivalent loop using iterators to reset all the elements in ivec to 0
for (std::vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)
*iter = 0; // set element to which iter refers to 0
print_int_vector(ivec);
return 0;
}
2、tuple功能的实现【不可变性】
当我们对普通 iterator 类型解引用时,得到对某个元素的非 const。而假设我们对 const_iterator 类型解引用时。则能够得到一个指向 const 对象的引用),如同不论什么常量一样,该对象不能进行重写。
能够对迭代器进行自增以及使用解引用操作符来读取值,但不能对该元素赋值。
vector<int> nums(10); // nums is nonconst
const vector<int>::iterator cit = nums.begin();
*cit = 1; // ok: cit can change its underlying element
++cit; // error: can't change the value of cit
【注意:const_iterator 对象能够用于 const vector 或非 const vector,由于不能改写元素值。
const 迭代器这样的类型差点儿没什么用处:一旦它被初始化后,仅仅能用它来改写其指向的元素,但不能使它指向不论什么其它元素。】
总结
此时。必须使用const_iterator 来获取每一个元素的值。
迭代器的算术操作
加或减之后的结果必须指向 iter 所指 vector 中的某个元素。或者是 vector 末端的后一个元素。加上或减去的值的类型应该是 vector 的 size_type 或 difference_type 类型,样例:
int main()
{
std::vector<int> ivec(10, 68);
print_int_vector(ivec);
int i = 0;
for (std::vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter, i++)
*iter = i; // set element to which iter refers to i
print_int_vector(ivec);
std::vector<int>::iterator iter = ivec.begin();
iter += 100;
std::cout<<*iter; return 0;
}
本样例中ivec有10个元素,iter+=j。j在10以内都不会有错(0~9),大于等于10则会出现溢出问题。编译器。执行中间都不会报错。能够加当然能够减。
iter1 与 iter2 两者必须都指向同一 vector 中的元素,或者指向 vector 末端之后的下一个元素。
vector<int>::iterator mid = vi.begin() + vi.size() / 2;
上述代码用来初始化 mid 使其指向 vi 中最靠近正中间的元素。
这样的直接计算迭代器的方法,与用迭代器逐个元素自增操作到达中间元素的方法是等价的,但前者的效率要高得多。
比如。在调用 push_back 之后,就不能再信赖指向 vector 的迭代器的值了。
*iter = i; // set element to which iter refers to i
ivec.push_back(i*2);
加上这句代码没问题,正确执行,可是。我们试图在for循环里面执行,即:
{
*iter = i; // set element to which iter refers to i
ivec.push_back(i*2);
}
则会莫名其妙退出!
本文由@The_Third_Wave(Blog地址:http://blog.csdn.net/zhanh1218)原创。
因为还有部分内容没有接触,仅仅讲了大概没有原因,会不定期更新。有错误请指正。
假设你看到这篇博文时发现不完整,那是我为防止爬虫先公布一半的原因,请看原作者Blog。
假设这篇博文对您有帮助,为了好的网络环境,不建议转载,建议收藏!假设您一定要转载,请带上后缀和本文地址
C/C++迭代器使用具体解释的更多相关文章
- 设计模式 - 迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释
迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考迭代器模式(ite ...
- 设计模式 - 组合模式(composite pattern) 迭代器(iterator) 具体解释
组合模式(composite pattern) 迭代器(iterator) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考组合模式(composit ...
- python基础之 迭代器回顾,生成器,推导式
1.迭代器回顾 可迭代对象:Iterable 可以直接作用于for循环的对象统称为可迭代对象:Iterable.因为可迭代对象里面存在可迭代协议,所以才会被迭代 可迭代对象包括: 列表(list) 元 ...
- 【Java学习】Java迭代器
迭代器是一种模式,它可以使得对于序列类型的数据结构的遍历行为与被遍历的对象分离,即我们无需关心该序列的底层结构是什么样子的.只要拿到这个对象,使用迭代器就可以遍历这个对象的内部. 1.Iterator ...
- node 异步回调解决方法之yield
先看如何使用 使用的npm包为genny,npm 安装genny,使用 node -harmony 文件(-harmony 为使用es6属性启动参数) 启动项目 var genny= require( ...
- c++模板库(简介)
目 录 STL 简介 ......................................................................................... ...
- STL区间成员函数及区间算法总结
STL区间成员函数及区间算法总结 在这里总结下可替代循环的区间成员函数和区间算法: 相比单元素遍历操作,使用区间成员函数的优势在于: 1)更少的函数调用 2)更少的元素移动 3)更少的内存分配 在区间 ...
- python学习日记(生成器函数进阶)
迭代器和生成器的概念 迭代器 对于list.string.tuple.dict等这些容器对象,使用for循环遍历是很方便的.在后台for语句对容器对象调用iter()函数.iter()是python内 ...
- cursor游标(mysql)
/* 游标 cursor 什么是游标?为什么需要游标 使用存储过程对sql进行编程的时候,我们查询的语句可能是数据是多个,它总是一口气全部执行,我们无法针对每一条进行判断.也就是说,我们无法控制程序的 ...
随机推荐
- java结构与算法之冒泡排序
一.什么是冒泡排序:冒泡排序是在从相邻两个数之间进行比较,这里将前面一个值定义为before,后面一个值定义为after:当before>after时i,交换他们的值,如果before<a ...
- ThinkPHP第九天(在Admin分组中配置__PUBLIC__,$POST异步传输,import使用方法,验证码点击刷新方法,Create方法作用)
1.项目分组之后,后台模板的公用文件一般放置在Tpl/Admin/Public中,这样子在替换模板路径时候如果还用__PUBLIC__时为了不与前台冲突,应该在Admin/config.php中配置一 ...
- PHP函数积累
1.mt_rand(min,max):随机返回min,max之间的随整数机数. 2.date('Y-m-d H:m:s',时间戳),将时间戳格式化为相应的时间格式.time()取得时间戳 3.arra ...
- 「JAVA」:Berkeley DB的JAVA连接
Berkeley DB是一个嵌入式的数据库,它适合于管理海量的.简单的数据.关键字/数据(key/value)是Berkeley DB用来进行数据管理的基础.每个key/value构成了一条记录,而整 ...
- poj 1200 Crazy Search(hash)
题目链接:http://poj.org/problem?id=1200 思路分析:从数据来看,该题目使用线性时间算法,可见子串的比较是不可能的:使用hash可以在常数时间内查找,可以常数时间内判重, ...
- 2013杭州网络赛C题HDU 4640(模拟)
The Donkey of Gui Zhou Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- opencv是什么
OpenCV是一个用于图像处理.分析.机器视觉方面的开源函数库. 不管你是做科学研究,还是商业应用,opencv都能够作为你理想的工具库,由于,对于这两者,它全然是免费的.该库採用C及C+ ...
- swift菜鸟入门视频教程-07-闭包
本人自己录制的swift菜鸟入门,欢迎大家拍砖.有什么问题能够在这里留言. 主要内容: 闭包表达式(Closure Expressions) 跟随闭包(Trailing Closures) 值捕获(C ...
- Android学习——百度地图开发定位与显示Demo
百度地图给我们提供了很丰富的API供我们进行二次开发.百度地图的SDK与定位SDK在今年6月份进行了更新. 地图更新为3.0,定位更新为4.2.百度说:这次更新对接口有了较大部分的调整,与之前版本号不 ...
- z-index要同级比较,absolute包含块外有overflow-hidden
z-index只能在position属性值为relative或absolute或fixed的元素上有效. z-index只决定同一父元素中的同级子元素的堆叠顺序. position:absolute ...