一:迭代器内部原理
内置迭代器实现案例
下面为一个 list 的内置迭代器实现案例。
通过该案例我们能够清楚的理解迭代器的内部实现原理
- 迭代器是一个类中类
- 其原理是通过运算符的重载使得类的对象模仿指针的一种行为
//内置迭代器实现案例
#include<iostream>
//#include<list>
using namespace std;
//结点结构体
template<typename type>
struct Node
{
//互为重载的构造函数:
Node() :next(nullptr) {}
Node(type data) :data(data), next(nullptr) {}
Node(type data, Node<type>* next) :data(data), next(next) {}
//数据成员
type data; //数据域
Node<type>* next; //指针域
};
//再封装成链表list
template<typename type>
class list
{
public:
list()
{
listHeadNode = nullptr;
listTailNode = nullptr;
listSize = 0;
}
void push_back(type data); //尾插
void push_front(type data); //头插
type front(); //获取表头元素
protected:
Node<type>* listHeadNode;
Node<type>* listTailNode;
int listSize;
//迭代器的主要部分:类中类进行实现
//实质:通过运算符的重载使得类的对象模仿指针的一种行为
public:
Node<type>* begin()
{
return listHeadNode;
}
Node<type>* end()
{
return listTailNode->next;
}
//iterator为list的类中类
class iterator
{
public:
bool operator!=(Node<type>* pMove)
{
return this->pMove != pMove;
}
void operator=(Node<type>* pMove)
{
this->pMove = pMove;
}
type operator*()
{
return this->pMove->data;
}
iterator& operator++(int)
{
this->pMove = this->pMove->next;
return *this;
}
protected:
Node<type>* pMove;
};
};
//push_back
template<typename type>
void list<type>::push_back(type data)
{
//动态内存申请
Node<type>* newNode = new Node<type>(data);
if(listSize==0)
{
listHeadNode = newNode;
listTailNode = newNode;
}
else
{
listTailNode->next = newNode;
listTailNode = newNode;
}
listSize++;
}
//push_front
template<typename type>
void list<type>::push_front(type data)
{
//动态内存申请
Node<type>* newNode = new Node<type>(data);
if (listSize == 0)
{
listHeadNode = newNode;
listTailNode = newNode;
}
else
{
newNode->next = listHeadNode;
listHeadNode->next = newNode;
}
listSize++;
}
//front
template<typename type>
type list<type>::front()
{
return listHeadNode->data;
}
int main()
{
list<int> myList;
myList.push_back(1);
myList.push_back(2);
myList.push_back(3);
list<int>::iterator myIter; //list<int>::iterator myIter = myList.begin();编译器解释为没有重载构造函数,而不是重载 = 的问题
for (myIter = myList.begin(); myIter != myList.end(); myIter++)
{
cout << *myIter << "\t";
}
cout << endl;
system("pause");
return 0;
}
二:内置迭代器介绍
内置迭代器有:正向迭代器、反向迭代器、常属性迭代器、常属性反向迭代器
迭代器种类 | 类中类名称 | 起始 | 结束 |
---|---|---|---|
正向迭代器 | iterator | begin() | end() |
反向迭代器 | reverse_iterator | rbegin() | rend() |
常属性迭代器 | const_iterator | cbegin() | cend() |
常属性反向迭代器 | const_reverse_iterator | crbegin() | crend() |
迭代器的使用示例:
list<int> myList;
myList.push_back(1);
myList.push_back(2);
myList.push_back(3);
list<int>::iterator Iter; //正向迭代器
cout << "正向输出" << endl;
for (Iter = myList.begin(); Iter != myList.end(); Iter++)
{
cout << *Iter << "\t";
}
cout << endl;
list<int>::reverse_iterator rIter;//逆向迭代器
cout << "逆向输出" << endl;
for (rIter = myList.rbegin(); rIter != myList.rend(); rIter++)
{
cout << *rIter << "\t";
}
cout << endl;
其他类型容器的迭代器的使用可以进行类比:
以map映射进行举例:
//其他容器的迭代器可以进行类比
map<string, string> myMap;
myMap["love"] = "you";
myMap["I"] = "you";
map<string, string>::reverse_iterator mapIter;
for (mapIter = myMap.rbegin(); mapIter != myMap.rend(); mapIter++)
{
cout << mapIter->first << " " << mapIter->second << "\t" << endl;
}
注意:适配器(如:stack 、queue、priority_queue)没有迭代器
三:流型迭代器
流型迭代器用到的其实并不多,了解即可
(一):输出流型迭代器
输出流型迭代器的两种形式:
- ostream_iterator<type>(ostream out); //用的少
- ostream_iterator<type>(ostream out,char* ch); //以后面的字符串做间隔进行输出
注意:第二种形式中第二个参数类型为 char* 而不是 string,如string类型需要通过string类的方法c_str()转换为char*。
1. 输出流型迭代器做等号等效于输出
#include<iostream>
#include<iterator>
using namespace std;
int main()
{
//输出流型迭代器
//1.
ostream_iterator<int> ostreamIter(cout);
ostreamIter = 1314520; //流型迭代器做等号运算等效于输出 等效于cout<<1314521;
//2.
ostream_iterator<int> ostreamIter(cout, "\n");
ostreamIter = 1314520; //流型迭代器做等号运算等效于输出 等效于cout<<1314521<<endl;
return 0;
}
2. 输出流型迭代器与copy算法的结合
#include<iostream>
#include<iterator>
using namespace std;
int main()
{
//输出流型迭代器
//copy算法
//copy(iterator begin,iterator end,iterator newBegin);
int array[] = { 1,2,3,4,5,6,7,8,9,10 };
copy(array + 0, array + 10, ostream_iterator<int>(cout,"\t")); //ostream_iterator<int>(cout, "\t")为构造的一个无名流型迭代器
cout << endl;
return 0;
}
(二):输入流型迭代器
输入流型迭代器的两种形式:
- istream_iterator<type> end_of_ stream 输入流结束标记。错误
- istream_iterator<type>(istream in) 用做输入
#include<iostream>
#include<iterator>
#include<vector>
using namespace std;
int main()
{
//输入流型迭代器
istream_iterator<int> inputIter(cin); //做输入
istream_iterator<int> iEof; //结束标记
vector<int> myVector;
while (inputIter != iEof)//当输入错误时,流型迭代器产生end_of_ stream可用来做结束标记
{
myVector.push_back(*inputIter); //将输入流迭代器中的值取出来插入到myVector中去
inputIter++; //输入操作
}
cout << "myVector" << endl;
copy(myVector.begin(), myVector.end(), ostream_iterator<int>(cout, "\t"));//ostream_iterator<int>(cout, "\t")为构造的一个无名流型迭代器
cout << endl;
return 0;
}