迭代器(iterator)

迭代器是一种“能够遍历某个序列内所有元素”的对象。

一..随机存取迭代器:

以下对象支持随机存取迭代器

可随机存取的容器(vector,deque)

strings

一般arrray(指针)


下面是一个随机存取(Random Access)迭代器的例子:

#include<iostream>
#include<vector>

using namespace std;

void main()
{
	vector<int> myv;

	for (int i = -3; i <= 9; ++i)
	{
		myv.push_back(i);
	}

	//打印元素的个数
	//iter1-iter2 传回iter1和iter2之间的距离
	cout << "num of ele=" << <span style="color:#ff0000;">myv.end() - myv.begin()</span> << endl;

	//打印出所有元素
	//用operator<代替!=
	vector<int>::iterator it;
	for (it = myv.begin(); <span style="color:#ff0000;">it < myv.end()</span>; ++it)
	{
		cout << *it << "   ";
	}
	cout << endl;

	//打印所有元素
	//使用下标运算符[]
	for (int i = 0; i < myv.size(); ++i)
	{
		cout << myv.begin()<span style="color:#ff0000;">[i]</span> << "   ";
	}
	cout << endl;
	
	//每两个打印一次、
	for (it = myv.begin(); it < myv.end() - 1; it += 2)
	{
		cout << *it << "   ";
	}
	cout << endl;
	
	cin.get();

}


注意:
在这里operator -和operator[] 只有在随机存取迭代器中被重载。

通过随机存取迭代器遍历容器的时候,可以使用operator<代替!=。


二..迭代器的相关辅助函数

1.advance():可将迭代器的位置增加,增加的幅度由参数决定,也就是说使迭代器一次前进

或者后退多个元素。

本质:面对随机存取迭代器,此函数只是简单的调用pos+=n;因此具有常量复杂度。

对于其他任何类型的迭代器则调用++pos(或--pos),此时,本函数具有线性复杂度。


下面是使用advance()函数的一个例子


#include<iostream>
#include<list>

using namespace std;

void main()
{
	list<int> mylist;
	for (int i = 1; i <= 9; ++i)
	{
		mylist.push_back(i);
	}
	
	list<int>::iterator pos;
	for (pos = mylist.begin(); pos != mylist.end(); ++pos)
	{
		cout << *pos<<"   ";
	}
	cout << endl;
	list<int>::iterator it=mylist.begin();
	cout << *it << endl;
	advance(it, 3);//迭代器前进或者后退
	cout << *it << endl;
	advance(it, -1);
	cout << *it << endl;

	cin.get();
}


2.distance():用来处理两个迭代器之间的距离。

本质:面对随机存取迭代器,此函数仅仅是传回pos2-pos1,因此具备常数复杂度。

对于其他迭代器类型,distance()会不断递增pos1,知道抵达pos2为止,然后返回

递增次数。此时本函数具备线性复杂度。


下面是使用distance()的例子:


#include<iostream>
#include<list>

using namespace std;

void main()
{
	list<int> mylist;

	for (int i = 1; i <= 9; ++i)
	{
		mylist.push_back(i);
	}
	for (auto i : mylist)
	{
		cout << i << "   ";
	}
	cout << endl;
	list<int>::iterator pos;
	pos = find(mylist.begin(), mylist.end(), 5);
	if (pos != mylist.end())
	{
		cout << "找到了5,distance b/t beginning and 5 is" << distance(mylist.begin(), pos) << endl;
	}
	else
	{
		cout << "没有找到" << endl;
	}

	cin.get();
}

3.iter_swap():用来交换两个迭代器所指的元素的内容。

注意:迭代器的类型不必相同,但是其所指的两个值必须可以相互赋值。

下面是使用iter_swap()的例子:


#include<iostream>
#include<list>
using namespace std;

void main()
{
	list<int> mylist;
	for (int i = 1; i <= 9; ++i)
	{
		mylist.push_back(i);
	}

	for (auto i : mylist)
	{
		cout << i << "   ";
	}
	cout << endl;

	iter_swap(mylist.begin(), ++mylist.begin());
	for (auto i : mylist)
	{
		cout << i << "   ";
	}
	cout << endl;

	iter_swap(mylist.begin(), --mylist.end());
	for (auto i : mylist)
	{
		cout << i << "   ";
	}
	cout << endl;
	

	cin.get();
}



你可能感兴趣的:(迭代器(iterator))