迭代器
迭代器(iterator)是一种抽象的设计概念,现实程序语言中并没有直接对应于这个概念的实物。在<>一书中提供了23中设计模式的完整描述,其中iterator模式定义如下:提供一种方法,使之能够依序寻访某个容器所含的各个元素,而又无需暴露该容器的内部表示方式。迭代器的设计思维-STL的关键所在,STL的中心思想在于将容器(container)和算法(algorithms)分开,彼此独立设计,最后再一贴胶着剂将他们撮合在一起。
迭代器的种类:
输入迭代器 | 提供对数据的只读访问 | 只读,支持++、==、!= |
---|---|---|
输出迭代器 | 提供对数据的只写访问 | 只写,支持++ |
前向迭代器 | 提供读写操作,并能向前推进迭代器 | 读写,支持++、==、!= |
双向迭代器 | 提供读写操作,并能向前和向后操作 | 读写,支持++、–, |
随机访问迭代器 | 提供读写操作,并能以跳跃的方式访问容器的任意数据,是功能最强的迭代器 | 读写,支持++、–、[n]、-n、<、<=、>、>= |
举个例子:
#include <iostream>
#include <vector>
#include <algorithm>
#define _CRT_SECURE_NO_WARNINGS
using namespace std;
// STL中的容器算法迭代器
void test01(){
vector<int> v; // STL中的标准容器之一:动态数组
v.push_back(1);// vector容器提供插入数据的方法
v.push_back(5);
v.push_back(3);
v.push_back(7);
// 迭代器
vector<int>::iterator pStart = v.begin(); // vector容器提供了begin()方法返回指向第一个元素的迭代器
vector<int>::iterator pEnd = v.end();//vector 容器提供了 end()方法 返回指向最后一个元素下一个位置的迭代器
// 算法 count算法用于统计元素的个数
int n = count(pStart, pEnd, 5);
cout << "n:" << n << endl;
// 通过迭代器遍历
while(pStart != pEnd){
cout << *pStart << " ";
pStart++;
}
cout << endl;
}
// STL容器不单单可以存储基础数据类型也可以存储对象
class Teacher
{
public:
Teacher(int age) : age(age){};
~Teacher(){};
public:
int age;
};
void test02(){
vector<Teacher> v;// 存储Teacher类型数据的容器
Teacher t1(10),t2(20),t3(30);
v.push_back(t1);
v.push_back(t2);
v.push_back(t3);
vector<Teacher>::iterator pStart = v.begin();
vector<Teacher>::iterator pEnd = v.end();
// 通过迭代器遍历
while(pStart != pEnd){
cout << pStart->age << " ";
pStart++;
}
cout << endl;
}
// 存储Teacher类型指针
void test03(){
vector<Teacher*> v;// 存储Teacher类型指针
Teacher* t1 = new Teacher(10);
Teacher* t2 = new Teacher(20);
Teacher* t3 = new Teacher(30);
v.push_back(t1);
v.push_back(t2);
v.push_back(t3);
// 拿到容器迭代器
vector<Teacher*>::iterator pStart = v.begin();
vector<Teacher*>::iterator pEnd = v.end();
// 通过迭代器遍历
while(pStart != pEnd){
cout << (*pStart)->age << " ";
pStart++;
}
cout << endl;
}
// 容器嵌套容器
void test04(){
vector< vector<int> > v;
vector<int> v1;
vector<int> v2;
vector<int> v3;
for(int i = 0;i < 5;i++){
v1.push_back(i);
v2.push_back(i * 10);
v3.push_back(i * 100);
}
v.push_back(v1);
v.push_back(v2);
v.push_back(v3);
for(vector< vector<int> >::iterator it = v.begin();it != v.end();it++){
for(vector<int>::iterator subIt = (*it).begin(); subIt != (*it).end();subIt++){
cout << *subIt << " ";
}
cout << endl;
}
}
int main(int argc, char** argv)
{
test01();
test02();
test03();
test04();
return 0;
}
运行结果如下:
n:1
1 5 3 7
10 20 30
10 20 30
0 1 2 3 4
0 10 20 30 40
0 100 200 300 400