文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>C++学习笔记:Container和Iterator

C++学习笔记:Container和Iterator

时间:2010-09-14  来源:weichsel

C++学习笔记:Container和Iterator
2010-5-26

为什么需要Container

Container和动态对象创建结合起来,实现对大量、数目未知对象的创建、管理。
通常的用法是:根据需要New一个对象;将对象指针保存到Container中;需要访问对象的时候,从Container中获取对象指针。
另外一种管理对象的方法是静态方式,预先创建大规模的对象数组,数量满足系统的最大需要。这种方法会带来性能方面的问题。大量对象创建时要执行构造函数,性能的开销很大。

如何让Container支持不同类型的对象

方法1:Object-Based Hierachy

所有的类都直接或间接地从唯一的根类派生,所有的对象形成单根层级关系。这种方法被很多语言支持,比如Delphi。

对于C++来说,由于支持多继承,不能保证单根对象层次关系,这种方法存在问题。

方法2:Template

将类型参数化,代码与具体的类型无关,实现代码的重用。

对于程序员来说,Template的使用更为简单。

Template的一些特点:

  • 由编译器完成具体类型的替换;
  • 定义、声明总是放在头文件中;
  • 参数分为class type和Built-in type,后者是compile-time 常量。

Iterator实现

为Container提供一种遍历访问内部元素的机制。Iterator提供了类似指针的行为,使用者可以像访问数组一样访问Container内部的元素,而不必关心Container内部的实现。
Iterator使得不同Container具备相同的元素访问接口。那么,对元素的处理函数可以保持独立,不依赖与具体的Container。元素的处理函数在STL中被称为算法,可以说Iterator机制是STL中算法的基石。

Iterator典型的用法:
vector s;
vector::iterator it;
for (it = s.begin(); it != s.end(); it++) {
    cout << *it << endl;
}

从这段代码,我们可以了解到iterator实现上的一些功能要求:

  • iterator内嵌于Container中;
  • Container的begin(), end() 函数创建iterator对象;
  • iterator要支持运算符=, !=, ++, *;


下面是一个iterator实现的简单例子:

 

  1. using namespace std;  
  2. template  
  3. class PStack {  
  4.     struct LINK {  
  5.         T* data;  
  6.         LINK* next;  
  7.         LINK(T* v, LINK* lk): data(v), next(lk) {}  
  8.     }* head;  
  9. public:  
  10.     PStack(): head(NULL) {}  
  11.     ~PStack() {  
  12.         while (!head) {  
  13.             delete pop();  
  14.         }  
  15.     }  
  16.       
  17.     void add(T* val) {  
  18.         head = new LINK(val, head);  
  19.     }  
  20.     T* pop() {  
  21.         if (head == NULL) {  
  22.             return NULL;  
  23.         }  
  24.         T* data = head->data;  
  25.         LINK* old = head;  
  26.           
  27.         head = head->next;  
  28.           
  29.         delete old;  
  30.         return data;  
  31.     }  
  32.     class iterator;  
  33.     friend class iterator;  
  34.       
  35.     class iterator {  
  36.         PStack* s;  
  37.         LINK* p;  
  38.     public:  
  39.         iterator(): s(NULL), p(NULL) {}  
  40.         iterator(PStack* v): s(v), p(v->head) {}  
  41.         iterator(PStack* v, bool): s(v), p(NULL) {}  
  42.          
  43.         // copy constructor  
  44.         iterator(const iterator& it) {  
  45.             s = it.s;  
  46.             p = it.p;  
  47.         }  
  48.         // =  
  49.         iterator& operator=(const iterator& it) {  
  50.             s = it.s;  
  51.             p = it.p;  
  52.             return *this;  
  53.         }  
  54.         // !=  
  55.         bool operator!= (const iterator& it) {  
  56.             return (p != it.p);  
  57.         }  
  58.         // ++  
  59.         void operator++(int) {  
  60.             if (p != NULL) {  
  61.                 p = p->next;  
  62.             }  
  63.         }  
  64.         // *  
  65.         T* operator*() {  
  66.             if (p == NULL) {  
  67.                 return NULL;  
  68.             }  
  69.               
  70.             return p->data;  
  71.         }      
  72.           
  73.     };  
  74.     // create an iterator object  
  75.     iterator begin() {  
  76.         return iterator(this);  
  77.     }  
  78.     // create an iterator object  
  79.     iterator end() {  
  80.         return iterator(this, true);  
  81.     }  
  82. };  
  83.   
  84. int main() {  
  85.     PStack s;  
  86.     PStack::iterator it;  
  87.     s.add(new int(2));  
  88.     s.add(new int(4));  
  89.     s.add(new int(1));  
  90.     s.add(new int(3));  
  91.     for (it = s.begin(); it != s.end(); it++) {  
  92.         cout << *it << ":" << **it << endl;  
  93.     }  
  94.       
  95.     return 0;  

#include <iostream>  
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载