STL迭代器(iterator)

Posted wanglelelihuanhuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STL迭代器(iterator)相关的知识,希望对你有一定的参考价值。

迭代器定义

迭代器(iterator):扮演容器与算法之间的胶合剂,是所谓的“泛型指针”。共有5种类型

迭代器模式:提供一种方法,使之能够依序寻访某个聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表达方式。

STL的中心思想在于:将数据容器和算法分开,彼此独立设计,最后再以一贴胶着剂(iterator)将它们撮合在一起。

STL的迭代器是一个可遍历STL容器全部或者部分数据。

迭代器原理

迭代器是一种行为类似智能指针的对象,而指针最常见的行为就是内容提领和成员访问。因此迭代器最重要的行为就是对operator*和operator->进行重载。

 迭代器的应用

#include <iostream>
#include <vector>
#include <list>
#include <algorithm>
#include <string>
using namespace std;
void Test1()

	vector<int > v1;
	v1.push_back(5);
	v1.push_back(4);
	v1.push_back(3);
	v1.push_back(2);
	v1.push_back(1);
	// 迭代器遍历顺序表
	vector<int >::iterator it = v1.begin();
	for (; it != v1.end(); ++it)
	
		cout << *it << " ";
	
	cout << endl;
	// STL的排序算法
	sort(v1.begin(), v1.end());
	it = v1.begin();
	for (; it != v1.end(); ++it)
	
		cout << *it << " ";
	
	cout << endl;

void Test2()

	list<string > l1;
	l1.push_back("xjh");
	l1.push_back("zpw");
	l1.push_back("yb");
	l1.push_back("whb");
	// 迭代器遍历链表
	list<string >::iterator it = l1.begin();
	for (; it != l1.end(); ++it)
	
		cout << *it << " ";
	
	cout << endl;
	// STL的替换算法
	replace(l1.begin(), l1.end(), "xjh", "lcf");
	it = l1.begin();
	for (; it != l1.end(); ++it)
	
		cout << *it << " ";
	
	cout << endl;

void Test3()

	list<string > l1;
	l1.push_back("xjh");
	l1.push_back("zpw");
	l1.push_back("yb");
	l1.push_back("whb");
	// 迭代器遍历链表
	list<string >::iterator it = l1.begin();
	for (; it != l1.end(); ++it)
	
		cout << *it << " ";
	
	cout << endl;
	// STL的find 算法查找迭代器区间的数据,并返回找到节点的迭代器
	it = find(l1.begin(), l1.end(), "yb");
	if (it != l1.end())
	
		cout << "find success:" << *it << endl;
		// 通过迭代器修改节点数据
		*it = "yls";
	
	it = find(l1.begin(), l1.end(), "yb");
	if (it == l1.end())
	
		cout << "find failed" << endl;
	

迭代器失效

由删除导致,指向当前节点的迭代器被删除

解决办法:1、保存当前位置,指向下一个迭代器。2、用一个接收erase的返回值。

#include<iostream>
using namespace std;

#include<vector>
#include<list>
void PrintVector(vector<int>& v)

	vector<int>::iterator it = v.begin();
	while (it != v.end())
	
		cout << *it << " ";
		++it;
	
	cout << endl;

void PrintList(list<int>& l)

	list<int>::iterator it = l.begin();
	while (it != l.end())
		
		cout << *it << " ";
		++it;
	
	cout << endl;

void TestVector()

	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);

	PrintVector(v);
	vector<int>::iterator it = v.begin();
	while (it != v.end())
	
		//迭代器失效
		vector<int>::iterator tmp = it;
		++it;
		if ((*tmp) % 2 == 0)
		
			v.erase(tmp);
		

		(*it)++;
		cout << *it << " ";
		++it;
	
	cout << endl;

void TestList()

	list<int> l;
	l.push_back(1);
	l.push_back(2);
	l.push_back(3);
	l.push_back(4);

	PrintList(l);
	list<int>::iterator it = l.begin();
	while (it != l.end())
	
		//迭代器失效
		/*list<int>::iterator tmp = it;
		++it;
		if ((*tmp) % 2 == 0)
		
			l.erase(tmp);
		*/
		//迭代器失效
		if ((*it) % 2 == 0)
		
			it=l.erase(it);
		
		else
		
			++it;
		

		(*it)++;
		cout << *it << " ";
		++it;
	
	cout << endl;

迭代器的型别和类型萃取技术



#pragma once 
//迭代器型别
struct InputIteratorTag 
;
struct OutputIteratorTag 
;
struct ForwordIteratorTag : public InputIteratorTag 
;
struct BidirectionalIteratorTag : public ForwordIteratorTag 
;
struct RandomAccessIteratorTag : public BidirectionalIteratorTag 
;

template <class T, class Distance> 
struct InputIterator 

	typedef InputIteratorTag IteratorCategory;
	typedef T                  ValueType;
	typedef Distance           DifferenceType;
	typedef T*                 Pointer;
	typedef T&                 Reference;
;

struct OutputIterator 

	typedef OutputIteratorTag IteratorCategory;
	typedef void                ValueType;
	typedef void                DifferenceType;
	typedef void                Pointer;
	typedef void                Reference;
;

template <class T, class Distance> struct ForwardIterator 

	typedef ForwordIteratorTag IteratorCategory;
	typedef T                    ValueType;
	typedef Distance             DifferenceType;
	typedef T*                   Pointer;
	typedef T&                   Reference;
;


template <class T, class Distance> struct BidirectionalIterator 

	typedef BidirectionalIteratorTag IteratorCategory;
	typedef T                          ValueType;
	typedef Distance                   DifferenceType;
	typedef T*                         Pointer;
	typedef T&                         Reference;
;

template <class T, class Distance> struct RandomAccessIterator

	typedef RandomAccessIteratorTag IteratorCategory;
	typedef T                          ValueType;
	typedef Distance                   DifferenceType;
	typedef T*                         Pointer;
	typedef T&                         Reference;
;
//
// 迭代器内嵌包含的种相应的型别
// IteratorCategory 、ValueType、 DifferenceType、Pointer、 Reference
// 这种内嵌的型别定义,确保了能够更方便的跟 STL融合。
// 且方便IteratorTraits的类型萃取
//
template <class Category, class T, class Distance = ptrdiff_t,
class Pointer = T*, class Reference = T&>
struct Iterator 

	typedef Category  IteratorCategory;// 迭代器类型
	typedef T         ValueType;// 迭代器所指对象类型
	typedef Distance  DifferenceType;// 两个迭代器之间的距离
	typedef Pointer   Pointer;// 迭代器所指对象类型的指针
	typedef Reference Reference;// 迭代器所指对象类型的引用
;
//Traits 就像一台 “ 特性萃取机 ” ,榨取各个迭代器的特性(对应的型别)
template <class Iterator>
struct IteratorTraits 

	typedef typename Iterator::IteratorCategory IteratorCategory;
	typedef typename Iterator::ValueType        ValueType;
	typedef typename Iterator::DifferenceType   DifferenceType;
	typedef typename Iterator::Pointer           Pointer;
	typedef typename Iterator::Reference         Reference;
;
/// 偏特化原生指针类型
template <class T>
struct IteratorTraits<T*> 

	typedef RandomAccessIteratorTag IteratorCategory;
	typedef T                          ValueType;
	typedef ptrdiff_t                  DifferenceType;
	typedef T*                         Pointer;
	typedef T&                         Reference;
;
/// 偏特化const原生指针类型
template <class T>
struct IteratorTraits<const T*>

	typedef RandomAccessIteratorTag IteratorCategory;
	typedef T                          ValueType;
	typedef ptrdiff_t                  DifferenceType;
	typedef const T*                   Pointer;
	typedef const T&                   Reference;
;
//Distance的实现
template <class InputIterator>
inline typename IteratorTraits<InputIterator>::DifferenceType
__Distance(InputIterator first, InputIterator last,InputIteratorTag) 

	IteratorTraits<InputIterator>::DifferenceType n = 0;
	while (first != last) 
	 
		++first; 
		++n; 
	

template <class RandomAccessIterator>
inline typename IteratorTraits<RandomAccessIterator>::DifferenceType
__Distance(RandomAccessIterator first, RandomAccessIterator last, RandomAccessIteratorTag)

	return last - first;

template <class InputIterator>
inline typename IteratorTraits<InputIterator>::DifferenceType
Distance(InputIterator first, InputIterator last) 

	return __Distance(first, last, IteratorTraits<InputIterator>::IteratorCategory());

//Advance的实现
template <class InputIterator, class Distance>
inline void __advance(InputIterator& i, Distance n, InputIteratorTag)

	while (n--) 
		++i;

template <class BidirectionalIterator, class Distance>
inline void __Advance(BidirectionalIterator & i, Distance n,BidirectionalIteratorTag)

	if (n >= 0)
		while (n--) ++i;
	else
		while (n++) --i;

template <class RandomAccessIterator, class Distance>
inline void __Advance(RandomAccessIterator & i, Distance n,RandomAccessIteratorTag)

	i += n;

template <class InputIterator, class Distance>
inline void Advance(InputIterator & i, Distance n)

	__Advance(i, n, IteratorTraits <InputIterator>::IteratorCategory());

template <class T, class Distance>
inline T* ValueType(const InputIterator<T, Distance>&) 
	return (T*)(0);

/
template <class T, class Distance>
inline T* ValueType(const ForwardIterator<T, Distance>&) 
	return (T*)(0);


template <class T, class Distance>
inline T* ValueType(const BidirectionalIterator<T, Distance>&) 
	return (T*)(0);


template <class T, class Distance>
inline T* ValueType(const RandomAccessIterator<T, Distance>&) 
	return (T*)(0);


template <class T>
inline T* ValueType(const T*)  return (T*)(0); 

//
// 逆置迭代器的定义,反向迭代器是正向迭代一层封装

template <class Iterator>
class ReverseIterator

public:
	// 通过迭代器萃取器,萃取出正向迭代器中定义的基本类型	
	typedef typename IteratorTraits<Iterator>::IteratorCategory IteratorCategory;
	typedef typename IteratorTraits<Iterator>::ValueType        ValueType;
	typedef typename IteratorTraits<Iterator>::DifferenceType   DifferenceType;
	typedef typename IteratorTraits<Iterator>::Pointer          Pointer;
	typedef typename IteratorTraits<Iterator>::Reference        Reference;

	typedef Iterator IteratorType;
	typedef ReverseIterator<Iterator> Self;
public:
	ReverseIterator() 
	
	explicit ReverseIterator(IteratorType x)
		: _current(x)
	

	Reference operator*() const
	
		// 注意这里解引用时取的是当前位置的前一个数据。
		// 以为RBegin()==End() REnd()==Begin() 
		Iterator tmp = _current;
		return *--tmp;
	

	Pointer operator->() const
	
		return &(operator*());
	

	Self& operator++() 
	
		--_current;
		return *this;
	
	Self operator++(int)
	
		Self tmp = *this;
		--_current;
		return tmp;
	
	Self& operator--() 
	
		++_current;
		return *this;
	
	Self operator--(int) 
	
		Self tmp = *this;
		++_current;
		return tmp;
	

	bool operator != (const Self& x) 
	
		return _current != x._current;
	

protected:
	Iterator _current;
;


以上是关于STL迭代器(iterator)的主要内容,如果未能解决你的问题,请参考以下文章

Sword STL迭代器prev,next相关函数

STL 2—迭代器相关运算——advance(),distance(),next(),prev()

C++:迭代器iterator

STL 迭代器(iterator)详解

STL 笔记 迭代器 iterator

STL之迭代器(iterator)