STL迭代器

迭代器
迭代器(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
posted @ 2020-02-14 13:09  阳神  阅读(125)  评论(0编辑  收藏  举报