1. STL链表
1.1 链表
迭代器可以对容器进行访问,不需要了解容器内部结构
代码如下(示例):
#ifndef YHP_LIST_H
#define YHP_LIST_H
namespace yhp
{
template<class _Ty>
class list
{
private:
struct Node;//声明结构体
typedef struct _Node* _Nodeptr;//声明结构体类型指针
struct _Node
{
_Nodeptr _Prev, _Next;//前驱,后继
_Ty _Value;//数据域
};
struct _Acc;
struct _Acc
{
typedef struct _Node*& _Nodepref;//指针的引用类型
typedef _Ty& _Vref;//值引用类型
static _Vref _Value(_Nodeptr _P)
{
return (*_P)._Value;
}
static _Nodepref _Pref(_Nodeptr _P)
{
return (*_P)._Pref;
}
static _Nodepref _Next(_Nodeptr _P)
{
return(*_P)._Next;
}
};
public:
typedef _Ty value_type;//值类型
typedef _Ty& reference;//引用类型
typedef const Ty& const_reference;//常引用类型
typedef _Ty* pointer;//指针类型
typedef const _Ty* const_pointer;//常指针类型
public:
class iterator;//普通迭代器
class const_iterator;//常性迭代器
class const_iterator//能够对每个节点进行依次迭代,但是不能修改每个节点的值
{
};
class iterator
{
private:
_Nodeptr _Ptr;
public:
iterator(Nodeptr _P) :Ptr(_P) {}
operator*()//取得当前节点数据
{
return _Acc::_Value(_Ptr);
}
pointer operator->() const
{
return &_Acc::_Value(_Ptr);
//return &**this;迭代器迭代的值的引用
}
operator++();
operator++(int);
operator--();
operator--(int);
};
};
}
#endif
1.2 迭代器示例
迭代器特点:抽象,泛化,归一,特化
代码如下(示例):
#include"stdio.h"
#include<iostream>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#include<vector>
#include<map>
#include<list>
#include<thread>
#include<mutex>
#include<typeinfo>
#include<map>
#include<queue>
#include<functional>
using namespace std;
int main()
{
vector<int> ar = { 12,23,34,45,56,67,78,89,90,100 };
list<int> br = { 12,23,34,45,56,67,78,89,90,100 };
map<int, int> amap = { {1,2},{3,4},{5,6},{7,8},{9,10} };
for (vector<int>::iterator it = ar.begin(); it != ar.end(); ++it)
{
cout << *it << " ";
}
cout << endl;
for (list<int>::iterator it = br.begin(); it != br.end(); ++it)
{
cout << *it << " ";
}
cout << endl;
for (map<int,int>::iterator it = amap.begin(); it !=amap.end(); ++it)
{
cout << it->first << " " << it->second << endl;
}
return 0;
}
运行结果: