• 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
    别废话,拿你代码给我看。
  • 相关阅读:
    分数拆分
    thinkphp URL规则、URL伪静态、URL路由、URL重写、URL生成(十五)
    iOS_12_tableViewCell的删除更新_红楼梦
    关于0基础磁盘管理(gpt UEFI...)最好的一篇文章(来自gentoo linux)
    HDU 3564 Another LIS splay(水
    jsp表达式
    XML(四)dom4j解析XML
    Android学习笔记(十八)——使用意图筛选器和实现浏览网页(附源代码)
    Oracle企业管理框架
    em grid control网格控制
  • 原文地址:https://www.cnblogs.com/lvxueyang/p/13707489.html
Copyright © 2020-2023  润新知