C++之iterator(迭代器)学习
2018-03-04 12:41
405 查看
迭代器是一种检查容器内元素并便利元素的数据类型,迭代器可以很大程度上隔离容器底层实现,使用时只需依赖迭代器相对统一的方法/接口。Iterator类的访问方式就是把不同集合类的访问逻辑抽象出来,使得不用暴露集合内部的结构而达到循环遍历集合的效果。
1 容器的Iterator类型
vector<int>::iterator iter; 定义一个名为iter的变量,数据类型是vector<int>定义的iterator类型。
迭代器和迭代器类型的区别?
iterator表述两种事物,一般指的是迭代器的概念;而具体指的是vector定义的具体iterator类型,如vector<int>
若一种类型支持一组确定的操作,则称这种类型为迭代器。
每个容器都定义了iterator类型,而这种类型支持迭代器的各种操作。
2 begin和end操作(返回的是迭代器类型)
vector<int> ivec;
vector<int>::iterator iter = ivec.begin();
vector<int>::iterator iter1 = ivec.end();
begin指向第一个元素,即ivec[0]
end指向末端元素的下一个,指向一个不存在的元素。(启动一个哨兵的作用)
若vector为空,begin和end返回的迭代器相同。
3 基本操作
*iter = 0; 等价于 ivec[0] = 0
++iter 指向iter的下一个元素
可以使用== 或 != 比较两个迭代器是否相同
for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); iter++) *iter = 0; 等价于
for (vector<int>::size_type ix= 0; ix != ivec.size(); ix++) ivec[ix]= 0;
3 const_iterator
(1) vector<int>::const_iterator iter 表示指向的值为常量,iter可移动指针
const vector<int>::iterator iter 表示指针为常量,不可移动指针,可修改其值
(2)算术操作
iter+n iter-n 表示迭代器向前或向后移动迭代器
iter1-iter2 计算两个迭代器的距离
vector<int>::iterator mid = vi.begin() + vi.size()/2 计算中间元素
可通过end和begin函数计算容器的大小,如下
vector<int>::size_type size = str.end() - str.begin();
cout << size << endl;
vector<int>::iterator mid = (vi.begin() + vi.end())/2 编译报错,两个地址不允许做加法和除法
example:
#include <vector>
#include <iostream>
using namespace std;
using std::vector;
int main()
{
string word;
vector <string> str(3);
str[0] = "aaa";
str[1] = "bbb";
str[2] = "ccc";
vector<string>::iterator mid = str.begin() + str.size()/2;
cout << *mid << endl;
str.push_back("ddd");
str.push_back("eee");
str.push_back("fff");
vector<string>::iterator mid2 = str.begin() + str.size()/2;
cout << *mid2 << endl;
return 0;
}
[root@iZwz9a9kyixoqvys89ewj4Z vector]# ./a.out
bbb
ddd
1 容器的Iterator类型
vector<int>::iterator iter; 定义一个名为iter的变量,数据类型是vector<int>定义的iterator类型。
迭代器和迭代器类型的区别?
iterator表述两种事物,一般指的是迭代器的概念;而具体指的是vector定义的具体iterator类型,如vector<int>
若一种类型支持一组确定的操作,则称这种类型为迭代器。
每个容器都定义了iterator类型,而这种类型支持迭代器的各种操作。
2 begin和end操作(返回的是迭代器类型)
vector<int> ivec;
vector<int>::iterator iter = ivec.begin();
vector<int>::iterator iter1 = ivec.end();
begin指向第一个元素,即ivec[0]
end指向末端元素的下一个,指向一个不存在的元素。(启动一个哨兵的作用)
若vector为空,begin和end返回的迭代器相同。
3 基本操作
*iter = 0; 等价于 ivec[0] = 0
++iter 指向iter的下一个元素
可以使用== 或 != 比较两个迭代器是否相同
for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); iter++) *iter = 0; 等价于
for (vector<int>::size_type ix= 0; ix != ivec.size(); ix++) ivec[ix]= 0;
3 const_iterator
(1) vector<int>::const_iterator iter 表示指向的值为常量,iter可移动指针
const vector<int>::iterator iter 表示指针为常量,不可移动指针,可修改其值
(2)算术操作
iter+n iter-n 表示迭代器向前或向后移动迭代器
iter1-iter2 计算两个迭代器的距离
vector<int>::iterator mid = vi.begin() + vi.size()/2 计算中间元素
可通过end和begin函数计算容器的大小,如下
vector<int>::size_type size = str.end() - str.begin();
cout << size << endl;
vector<int>::iterator mid = (vi.begin() + vi.end())/2 编译报错,两个地址不允许做加法和除法
example:
#include <vector>
#include <iostream>
using namespace std;
using std::vector;
int main()
{
string word;
vector <string> str(3);
str[0] = "aaa";
str[1] = "bbb";
str[2] = "ccc";
vector<string>::iterator mid = str.begin() + str.size()/2;
cout << *mid << endl;
str.push_back("ddd");
str.push_back("eee");
str.push_back("fff");
vector<string>::iterator mid2 = str.begin() + str.size()/2;
cout << *mid2 << endl;
return 0;
}
[root@iZwz9a9kyixoqvys89ewj4Z vector]# ./a.out
bbb
ddd
相关文章推荐
- C++学习笔记8——迭代器(iterator)
- C++学习之深入理解迭代器——迭代器特性、迭代器标志-iterator_traits
- 【C++ STL学习之八】逆向迭代器reverse_iterator
- 【C++ STL学习之八】逆向迭代器reverse_iterator
- C++学习笔记(五)迭代器iterator
- C++学习之Pair和迭代器 iterator的使用方法
- c++学习笔记--C++Primer第4版--迭代器iterator
- C++学习:迭代器iterator的使用
- Java学习之Iterator(迭代器)
- C++精华(STL)学习笔记之迭代器
- Java学习之Iterator(迭代器)的一般用法
- C++标准模板库 迭代器 iterator 详解(二)
- Java初学习-Iterator(迭代器)的一般用法
- C++学习笔记--标准库类型(vector,iterator,bitset)(三)
- Java学习之Iterator(迭代器)的一般用法 (转)
- 从零开始学C++之STL(三):迭代器类vector::iterator 和 vector::reverse_iterator 的实现、迭代器类型、常用的容器成员
- 面向对象与C++程序设计-向量和迭代器学习笔记
- C++每日积累学习整理——vector和迭代器
- C#学习基本概念之迭代器(Iterator)
- C++ 迭代器容器学习