1. 程式人生 > >C++迭代器理解與例項詳解

C++迭代器理解與例項詳解

定義一個數組:char buff[1024];當我們用指標char *p(char *p = buff)遍歷陣列時,指標p指向一維陣列首元素地址,每次都是從陣列第一個元素的偏移到指定位置,即進行指標運算。例如:訪問p[100]時,需要p+100,這樣浪費時間,影響效率。因此,我們引入迭代器概念。

一、迭代器介紹

迭代器iterator提供了對順序或關聯容器型別中的每個元素進行連續訪問的方法。

注意:

1.每個物件都有一個,即容器與迭代器之間互相繫結。

2. 迭代器迭代元素時必須知道底層的資料結構,陣列or連結串列,因此實現成巢狀類。

3. 每種容器都要提供iterator begin()和iterator end()。

4. iterator begin()指向容器第一個元素,iterator end()指向元素末尾下一個位置。

5. 迭代器只能讀取元素,不能修改元素。

二、迭代器的使用

1.簡單的字串迭代

#include<iostream>
using namespace std;
int main()
{
	string str = "sjdvbsszbk";
	string::iterator it1 = str.begin();//前面必須具有作用域,呼叫必須依賴物件
	string::iterator it2 = str.end();
	for(;it1 != it2;++it1)
	{
		cout<<*it1<<" ";
	}
	cout<<endl;

	return 0;
}
輸出:
s j d v b s s z b k
2.迭代容器的內容
#include<iostream>
#include<vector>
using namespace std;
int main()
{
	vector<int> vec;
	for(int i = 0;i < 10;i++)
	{
		vec.push_back(rand()%100);
	}
	vector<int>::iterator it1 = vec.begin();
	vector<int>::iterator it2 = vec.end();
	for(;it1 != it2;++it1)
	{
		cout<<*it1<<" ";
	}
	cout<<endl;

	return 0;
}
輸出隨機數:

41 67 34 0 69 24 78 58 62 64

3.自定義型別迭代

#include<iostream>
using namespace std;

template<typename T>
class CMyString
{
public:
	CMyString(T *p = T()):_str(p){}
	int size()
	{
		return strlen(_str);
	}
	class iterator
	{
	public:
		iterator(T *p = T()):_pcur(p){}
		bool operator!=(const iterator &src)
		{
			return _pcur != src._pcur;
		}
		void operator++()
		{
			++_pcur;
		}
		//對於[],*,->要提供兩種版本
		T operator*()
		{
			return *_pcur;
		}
		const T operator*()const
		{
			return *-pcur;
		}
	private:
		T *_pcur;
	};
	iterator begin()
	{
		return iterator(_str);
	}
	iterator end()
	{
		return iterator(_str+size());
	}
private:
	T *_str;
	friend ostream& operator<<<T>(ostream &,const CMyString<T> &);
};
template<typename T>
ostream& operator<<(ostream &out,const CMyString<T> &src)
{
	for(int i = 0;i < src.size();++i)
	{
		out<<src._str[i]<<" ";
	}
	return out;
}
int main()
{
	CMyString<char> str("sjdkvalnlsd");
	CMyString<char>::iterator it1 = str.begin();
	CMyString<char>::iterator it2 = str.end();
	for(;it1 != it2;++it1)
	{
		cout<<*it1<<" ";
	}
	cout<<endl;

	return 0;
}
輸出:

s j d k v a l n l s d

從此例中,我們可以清楚的看到,編寫自定義型別迭代器時,需要實現以下方法:

(1)operator!=() (2)operator ++() (3)operator*()