1. 程式人生 > >C++學習筆記(5)迭代器

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學習筆記5CvTrackbar,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查詢語句。 舉個栗子