C++STL之迭代器

1 迭代器:就是一个类中类,通过运算符重载利用类中类对象去遍历容器。

       1.1 迭代器分类

                正向迭代器:iterator

                        begin(); end();

                反向迭代器reverse_iterator

                        rbegin(); rend();

                常正向迭代器const_iterator

                        cbegin();cend();

                常反向迭代器const_reverse_iterator

                        crbegin();crend();

        1.2 按功能分

                正向迭代

                双向迭代

                随机访问迭代 

容器名     迭代器类型
array vector deque随机访问
stack/queue/priority_queue不支持
list   set/multiset   map/multimap双向

        1.3 迭代器的辅助函数

        移动:advance(iterator iter,int n);

        间距: distance(iterator begin(),iterator end());

        交换: iterator_swap(iterator first,iterator end);

        1.4 流型迭代器   一般用在辅助打印

                输出流型 构造方式

                        ostream_iterator<_Ty> iter(ostream& out);

                        ostream_iterator<_Ty> iter(ostream& out,char *str);

                        输出流型迭代做赋值运算,相当于打印数据到屏幕上。

                输入流型

                        istream_iterator<_Ty> iter;          //无参构造  构造无参对象是一个错误流(End_Of_Ostream)原本要输一个整形,现在输了一个字符串型  就是错误的

                        istream_iterator<_Ty> iter(istream& in);        //带参构造

                        *iter 等效cin>>操作

#include<vector>
#include<iostream>

using namespace std;

void testIter()
{
	vector<int> vec = {1,2,3,4,5,6,7};
	//正向迭代器
	vector<int>::iterator iter;
	for (iter = vec.begin(); iter != vec.end(); iter++)
	{
		cout << *iter << " ";
	}
	cout << endl;
	//反向迭代器
	vector<int>::reverse_iterator riter;
	for (riter=vec.rbegin(); riter != vec.rend(); riter++)
	{
		cout << *riter << " ";
	}
	cout << endl;
	//常正向迭代器
	vector<int>::const_iterator c_iter;
	for (c_iter = vec.cbegin(); c_iter != vec.cend(); c_iter++)
	{
		cout << *c_iter << " ";
	}
	cout << endl;
	//常反向迭代器
	vector<int>::const_reverse_iterator c_riter;
	for (c_riter = vec.crbegin(); c_riter != vec.crend(); c_riter++)
	{
		cout << *c_riter << " ";
	}
	cout << endl;
}

template<class _Ty>
struct Node
{
	_Ty data;
	Node<_Ty>* next;
	Node(_Ty data) :data(data), next(nullptr) {}
	Node(_Ty data, Node<_Ty>* next) :data(data), next(next) {}
};

template<class _Ty>
class MyList
{
public:
	MyList() :frontNode(nullptr), tailNode(nullptr)
	{
		cursize = 0;
	}
	void push_front(int data)
	{
		if (cursize == 0)
		{
			frontNode = new Node<_Ty>(data);
			tailNode = frontNode;
		}
		else
		{
			frontNode = new Node<_Ty>(data, frontNode);
		}
		cursize++;
	}
	void push_back() {}

	void printList()
	{
		Node<_Ty>* pMove = frontNode;
		while (pMove != nullptr)
		{
			cout << pMove->data << "\t";
			pMove = pMove->next;
		}
		cout << endl;
	}

	Node<_Ty>* begin()
	{
		return frontNode;
	}
	Node<_Ty>* end()
	{
		return nullptr;
	}

	class iterator
	{
	public:
		iterator(Node<_Ty>* pMove = nullptr) :pMove(pMove) {}		//构造 函数
		iterator(const iterator& object) :pMove(object.pMove) {}	//拷贝构造

		bool operator!=(Node<_Ty>* pMove)
		{
			return this->pMove != pMove;
		}
		iterator operator++(int)
		{
			pMove = pMove->next;
			return iterator(pMove);
		}
		_Ty operator*()
		{
			return pMove->data;
		}
	protected:
		Node<_Ty>* pMove;
	};
protected:
	Node<_Ty>* frontNode;
	Node<_Ty>* tailNode;
	int cursize;
};
void testMyList()
{
	MyList<int> list;
	list.push_front(1);
	list.push_front(2);
	list.push_front(3);
	list.printList();
	//通过迭代器遍历
	MyList<int>::iterator iter = list.begin();
	for (; iter != list.end(); iter++)
	{
		cout << *iter << " ";
	}
	cout << endl;
}

//辅助函数
void testEXFunction()
{
	vector<int> vec = {1,2,3,4,5,6,7};
	auto iter = vec.begin();
	//移动函数
	advance(iter,3);
	cout << *iter << endl;
	// 间隔函数
	cout << distance(vec.begin(), vec.end()) << endl;
	//交换函数
	iter_swap(vec.begin(),vec.end()-1);
	for (auto v : vec)
	{
		cout << v << " ";
	}

}

void testIoIterator()
{
	//输出流型迭代器
	ostream_iterator<int> iter(cout);
	iter = 123;			//做赋值运算就相当于打印到屏幕上
	cout << endl;
	ostream_iterator < int> iter2(cout,"我丫丫");
	iter2 = 1222;

	vector<int> data = {1,2,3,4,5,6,7,8};
	//等效打印
	cout << endl;
	copy(data.begin(),data.end(),ostream_iterator<int>(cout,"\t"));


	//输入流型迭代器
	cout << "输入流行迭代器" << endl;
	istream_iterator<int> end;// 无参  是一种错误流(end_of_stream)
	istream_iterator<int> in(cin);
	vector<int> inputData;
	while (in != end)		//直到输入类型不匹配结束
	{
		inputData.push_back(*in);
		++in;
	}
	for (auto v : inputData)
	{
		cout << v << " ";
	}
	cout << endl;
}

int main()
{
	//testIter();
	//testEXFunction();
	testIoIterator();
	
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值