C++學習筆記(5)迭代器
迭代器:設計了一個統一的遍歷容器的方式。
這種設計模式叫做迭代器模式。
容器中對資料結構進行了一個封裝,要想遍歷整個資料元素,
用普通指標是無法訪問容器的資料結構。
所以需要設計一個面向物件的指標來訪問。
可以讓容器中提供begin()和end()這個介面,用面想物件的指標通過這兩個介面就可以遍歷這個容器。
begin()//指向第一個有效元素的位置。
end()//指向最後一個有效元素的後繼的位置。
在遍歷時只需要容器提供一個++操作,就不需要去關注容器底層元素的型別是什麼了。
針對vector容器實現一個迭代器。
# include<iostream> template<typename Container> class Iterator;//迭代器的宣告 //vector容器 template<typename T> class Vector { public: typedef Iterator<Vector<T>> iterator;//對迭代器進行了型別重定義 typedef T value_type; Vector()//vector建構函式 { mdata = new T[2]; cursize =0; totalsize =2; } ~Vector() { delete[]mdata; mdata=NULL; } void push_back(T val) { if(IsFull()) { resize(); } mdata[cursize++]=val; } void pop_back() { if(idEmpty()) { throe execption("vector is empty!"); } cursize--; } iterator begin()//vector容器中提供begin介面 { return iterator(this,0);//返回第一個有效元素的位置 } iterator end()//vector容器中提供end介面 { return iterator(this,cursize);//返回最後一個有效元素的位置的後繼 } T& operator[](int index) { return mdata[index]; } bool IsFull() { return cursize == totalsize; } private: void resize() { T* pnewspace = new T[totalsize*2]; memcpy(pnewspace,mdata,sizeof(T)*totalsize); delete[]mdata; mdata=pnewspace; totalsize*=2; } T* mdata; int cursize; int totalsize; }; //迭代器 template<typename Container> class Iterator { public: Iterator(Container* pvec,int pos):mpvec(pvec),mpos(pos) {} bool operator!=(const Iterator<Container>& rhs) { return mpos!=rhs.mpos; } const Iterator operator++(int)//後置++,只需要一個型別宣告 { const Iterator tmp(*this); mpos++;//mpos++沒有對this造成影響 return tmp; } typename Container::value_type operator*() { return (*mpvec)[mpos];//mpevc是指向容器的指標,(*mpvec)解引用==於容器 } private: Container* mpvec;//面向物件的指標 int mpos;//下標位置,區別元素 }; int main() { Vector<int> vec;//生成一個容器物件 for(int i=0;i<10;i++) { vec.push_back(i+1); } Vector<int>::iterator it = vec.begin(); for(it;it!=vec.end();it++) { std::cout<<*it<<std::endl; } return 0; }
//針對String實現一個迭代器
class Iterator; class String { public: typedef Iterator iterator;//在string中對迭代器型別進行重定義 String(char* pstr):mpstr(new char[strlen(pstr)+1]())//建構函式 { strcpy(mpstr,pstr); } String(const String& rhs)//拷貝建構函式 { mpstr = new char[strlen(rhs.mpstr)+1](); strcpy(mpstr,rhs.mpstr); } String& operator=(const String& rhs) { if(this != &rhs) { delete[] mpstr; mpstr = new char[strlen(rhs.mpstr)+1](); strcpy(mpstr,rhs.mpstr); } return *this; } ~String() { delete[] mpstr; mpstr=NULL; } char& operator[](int index) { return mpstr[index]; } iterator begin(); iterator end(); private: char* mpstr; }; class Iterator { public: Iterator(String* string,int p):pstring(string),pos(p){}//建構函式 //針對建構函式沒有進行動態開闢(只需要賦值),不需要析構 Iterator& operator++() { ++pos; return *this; } char& operator*() { return(*pstring)[pos]; } bool operator!=(const Iterator& rhs) { return pos!=rhs.pos; } private: String* pstring;//Iterator生成的物件為面向物件的一個指標,內部成員變數的設計應該為容器的指標 int pos;//下標:區別元素 }; String::iterator String::begin() { return iterator(this,0); } String::iterator String::end() { return iterator(this,strlen(mpstr)); } int main() { String str1("hello world!"); String::iterator it=str1.begin(); for(it;it!=str1.end();++it) { std::cout<<*it; } std::cout<<std::endl; return 0; }
相關推薦
C++學習筆記(5)迭代器
迭代器:設計了一個統一的遍歷容器的方式。 這種設計模式叫做迭代器模式。 容器中對資料結構進行了一個封裝,要想遍歷整個資料元素, 用普通指標是無法訪問容器的資料結構。 所以需要設計一個面向物件的指標來訪問。 可以讓容器中提供begin()和end()這個介面,用
java/android 設計模式學習筆記(20)---迭代器模式
我們這篇部落格來介紹一下迭代器模式(Iterator Pattern),又稱為遊標(Cursor Pattern)模式,是行為型設計模式之一。迭代器模式算是一個比較古老的設計模式,其源於對容器的訪問,比如 Java 中的 List、Map、陣列等,我們知道對
ojective-C學習筆記(5)關於面向對象編程
reat com new 面向對象 cti 重要 dispatch circle 術語 先了解幾個OC中有關面向對象編程的術語 類(class)是一種表示對象類型的結構體。這裏所說的結構體和C語言中的結構體不是一回事。 對象(object)是一種包含值和指向其類的隱藏指針的
python3語言學習筆記(四:迭代器與生成器)
迭代器(iterator)------一種物件 迭代是Python最強大的功能之一,是訪問集合元素的一種方式。 迭代器是一個可以記住遍歷的位置的物件。 迭代器物件從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。 迭代器有兩個基本的方法:iter() 和
C#學習筆記(5)-值型別與引用型別
值型別 值型別的值存在棧上 int double char decimal bool enum struct 引用型別 引用型別存在堆上 - string - 陣列 - 自定義類 - 集合 - object - 介面
STM32學習筆記(5)——通用定時器PWM輸出
part 大小 模式 lan 晶振 kcon 筆記 利用 .cn 1、TIMER輸出PWM基本概念 脈沖寬度調制(PWM),是英文“Pulse Width Modulation”的縮寫,簡稱脈寬調制,是利用微處理器的數字輸出來對模擬
C++學習筆記——並不是所有迭代器都有加減法
能進行算術運算的迭代器只有隨即訪問迭代器,要求容器元素儲存在連續記憶體空間裡,vector,string,deque的迭代器是有加減法的,但是map,set,multimap,multiset的迭代器是沒有加減法的,list也不可以 該知識點是在刷leetco
C++菜鳥學習筆記系列(9)——迭代器
C++菜鳥學習筆記系列(9) 本期主題:迭代器介紹 我們在C++菜鳥學習筆記系列(7)、C++菜鳥學習筆記系列(8)中分別介紹了C++語言標準庫型別string,vector 的定義及使用。 對於string型別的物件我們可以通過範圍for語句和索引的方式訪問其
C#學習筆記(三)—–C#高階特性:列舉型別和迭代
C#學習筆記(三)—–try語句和異常 列舉型別 enumerator是隻讀的、只能在序列的值上向前移動的遊標。一個enumerator是一個實現了下列任一介面的物件: ①System.Collections.IEnumerator ②System.C
c++學習筆記(七)- lambda表達式 叠代器 算法
tex 參數 p s 刷題 algo 叠代器 裏的 blog 而且 關於lambda表達式: 刷題的時候遇到一句代碼不懂: char ch = *it;auto it2 = find_if(it, b.end(), [ch](char x){ return x != ch
C語言學習筆記(5)—— 語句(1)
c程式常見結構大概有選擇結構,迴圈結構,順序結構。c程式由一個一個的函式構成,而構成函式的則是語句,語句包含賦值語句,迴圈語句,條件語句,分支語句。賦值語句對與我們來說是很熟悉的。條件語句,分支語句與迴圈語句則會在後面一一介紹到。 順序結構對於我們來說是很熟悉的,它可以是這個樣子。 &nbs
C語言學習筆記(5)—— 語句(2)
在介紹過順序結構和選擇結構以後,我們能通過c語言做的事依舊很少,比如換硬幣問題。將一元的人民幣換成一分,兩分,五分的硬幣共50枚。如何解決這樣的問題呢?我們可以把它化解成一個求解線性方程組的問題。 可以設需要一分的硬幣x枚,兩分的硬幣y枚,五分的硬幣z枚。於是,我們可以得到一個方程組,像這樣:x+y
c# opencvsharp學習筆記(5)CvTrackbar,HSV,通道分割合併
1.CvTrackbarpublic CvTrackbar(string name, string window, CvTrackbarCallback callback); public CvTrackbar(string name, string window, CvTr
Swift學習筆記(5):集合類型
nbsp roc 三種 一個 刪除指定元素 edge 空值 port 自定義 目錄: 數組:Array 集合:Set 字典:Dictionary Swift提供Array(有序集合數據)、Set(無序無重復集合)和Dictionary(無序鍵值對集合)三
C#學習筆記(7)——委托
() namespace test task cnblogs [] string 命名空間 program 說明(2017-5-29 22:22:50): 1. 語法:public delegate void mydel();這一句在類外面,命名空間裏面。 2. 專門新建一
bootstrap 學習筆記(5)---- 圖片和響應式工具
-h thumb ima ble resp 圓角 rim ucc spl (一)響應式圖片: 在 Bootstrap 版本 3 中,通過為圖片添加 .img-responsive 類可以讓圖片支持響應式布局。其實質是為圖片設置了 max-width: 100%;、 heig
學習筆記(5)---數學運算
mat tla fix bsp matlab 循環 支持 -- oot 一.開n次方 比如-8的立方根,用nthroot(-8,-3),不建議用(-8)^(1/3) 二. 乘除 向0取整數:clear all;clc;fix(7/2)ans = 3-----------
C#學習筆記(12)——三種方法操作XML
結點 記得 ext 應用程序 eval 資源 特性 pla cells 說明(2017-7-11 16:56:13): 原文地址: C#中常用的幾種讀取XML文件的方法 XML文件是一種常用的文件格式,例如WinForm裏面的app.config以及Web程序中的web.c
QT學習筆記(5) 菜單欄、工具欄、窗口、對話框
let qlabel rman 運行 內存空間 介紹 edi left setw 本程序主要介紹了以下幾種常用控件的使用方法: (1)菜單欄、工具欄 (2)核心控件、狀態欄、浮動窗口 (3)模態窗口、非模態窗口 (4)標準對話框、文件對話框 代碼如下: mainwindow
Hibernate學習筆記(5)---Query接口
center 結束 mce factory rst lis 聚集 數據庫 ber Hibernate中具有三種檢索方式(HQL,QBC,SQL) Query接口 一個查詢接口,用於向數據庫中查詢對象。並控制執行查詢的過程。Query接口內封裝了一個HQL查詢語句。 舉個栗子