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;
}