【高级程序设计语言C++】 反向迭代器

  • 1.迭代器
  • 2.反向迭代器

1.迭代器

C++中有着很多的容器,然而有些容器并不像vector那样支持下标访问,所以就有了迭代器的概念。

#include 
#include 
using namespace std;
int main() {
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(31);
    v.push_back(41);
    v.push_back(51);
    v.push_back(61);
    v.push_back(71);
    vector<int>::iterator it = v.begin();
    while (it != v.end()) {
        cout << *it << " ";
        it++;
    }
    cout << endl;
    return 0;
}

2.反向迭代器

一个硬币都有着两面,何况是迭代器呢。所以在C++中,存在着反向迭代器的概念。

#include 
#include 
using namespace std;
int main() {
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(31);
	v.push_back(41);
	v.push_back(51);
	v.push_back(61);
	v.push_back(71);
	vector<int>::reverse_iterator it = v.rbegin();
	while (it != v.rend()) {
		cout << *it << " ";
		it++;
	}
	cout << endl;
	return 0;
}

想要用反向迭代器,首先要记住它的名字,reverse_iterator.

格式为:容器名 + <模板> + 域解析运算符(::) + reverse_iterator

它的设计参考正向迭代器,只是简单的把正向迭代器的功能反过来用。

#pragma once
namespace my_reverse_iterator
{
	template<class Iterator, class Ref, class Ptr>
	class Reverse_iterator
	{
		typedef Reverse_iterator<Iterator, Ref, Ptr> Self;
	public:
		ReverseIterator(Iterator it)
			:_it(it)
		{}

		Ref operator*()
		{
			Iterator tmp = _it;
			return *(--tmp);
		}

		Ptr operator->()
		{
			return &(operator*());
		}

		Self& operator++()
		{
			--_it;
			return *this;
		}

		Self& operator--()
		{
			++_it;
			return *this;
		}

		bool operator!= (const Self& s) const
		{
			return _it != s._it;
		}
	private:
		Iterator _it;
	};
	// vector和list反向迭代器实现
}

在上面的代码中可以看出,反向迭代器其实就是根据正向迭代器的相对位置来改写的。

比如:

  1. rbegin()对end()
  2. rend()对begin()
  3. ++对–
  4. –对++

其中要注意的是*的操作运算符的重载,这里同样是根据相对位置来写,因为list容器是带头双向链表,vector容器的end()迭代器是最后一个数的下一个位置。

typedef Reverse_iterator<Iterator, Ref, Ptr> Self
//typedef 是重命名
//<>里面呢就是模板的参数
//这里实际是有3个模板的,但是很多都是代码的复用,所以直接一个模板里面提供了3个模板参数
//就相当于有了3个不同参数的模板

你可能感兴趣的:(c++)