最近看了《STL源码剖析》和侯捷老师的STL课程,打算做一个小型的STL,在增加项目经验的同时也顺带复习STL和数据结构相关的知识。整个系列完全参考岚岚路的博客和github上的一个STL项目项目地址
任务
utility中定义pair类型(unordered_map中就是pair类型)
#pragma once
#ifndef _UTILITY_H_
#define _UTILITY_H_
namespace mySTL {
//交换的模板类
template<class T>
void swap(T& a, T& b) {
T temp = a;
a = b;
b = temp;
}
//pair的模板
template<class T1,class T2>
struct pair {
public:
typedef T1 first_type;
typedef T2 second_type;
public:
T1 first;
T2 second;
public:
pair(){
}
template<class U, class V>
pair(const pair<U, V>& pr);//借助引用的赋值
pair(const first_type& a, const second_type& b);//直接初始化
pair& operator= (const pair& pr);//与pair(const pair<U, V>& pr);相同,本质上是调用前者
void swap(pair& pr);
public:
template<class T1,class T2>
friend bool operator== (const pair<T1,T2>& lhs, const pair<T1, T2>& rhs);
template<class T1, class T2>
friend bool operator!= (const pair<T1,T2>& lhs, const pair<T1, T2>& rhs);
template<class T1, class T2>
friend bool operator< (const pair<T1,T2>& lhs, const pair<T1, T2>& rhs);
template<class T1, class T2>
friend bool operator<= (const pair<T1,T2>& lhs, const pair<T1, T2>& rhs);
template<class T1, class T2>
friend bool operator> (const pair<T1,T2>& lhs, const pair<T1, T2>& rhs);
template<class T1, class T2>
friend bool operator>= (const pair<T1,T2>& lhs, const pair<T1, T2>& rhs);
template<class T1, class T2>
friend void swap (const pair<T1,T2>& lhs, const pair<T1, T2>& rhs);
};
template <class T1, class T2>
template<class U, class V>
pair<T1,T2>::pair(const pair<U,V>& pr):first(pr.first),second(pr.second){
}
template <class T1, class T2>
pair<T1,T2>::pair(const first_type& a,const second_type& b):first(a),second(b){
}
template <class T1, class T2>
pair<T1, T2>& pair<T1, T2>::operator=(const pair<T1, T2> &pr) {
if (this != &pr) {
first = pr.first;
second = pr.second;
}
return *this;//返回引用
}
template <class T1, class T2>
void pair<T1, T2>::swap(pair<T1, T2>&pr) {
mySTL::swap(first, pr.first);
mySTL::swap(second, pr.second);
}
template <class T1, class T2>
bool operator== (const pair<T1,T2>& lhs, const pair<T1, T2>& rhs) {
return lhs.first == rhs.first&&lhs.second == rhs.second;
}
template <class T1, class T2>
bool operator!= (const pair<T1, T2>& lhs, const pair<T1, T2>& rhs) {
return !(lhs == rhs);
}
template <class T1, class T2>
bool operator< (const pair<T1, T2>& lhs, const pair<T1, T2>& rhs) {
return lhs.first<rhs.first||(!rhs.first < lhs.first && lhs.second<rhs.second);
}
template <class T1, class T2>
bool operator<= (const pair<T1, T2>& lhs, const pair<T1, T2>& rhs) {
return !(rhs < lhs);
}
template <class T1, class T2>
bool operator> (const pair<T1, T2>& lhs, const pair<T1, T2>& rhs) {
return rhs < lhs;
}
template <class T1, class T2>
bool operator>= (const pair<T1, T2>& lhs, const pair<T1, T2>& rhs) {
return !(lhs < rhs);
}
template<class T1, class T2>
void swap(pair<T1, T2>& x, pair<T1, T2>& y) {
x.swap(y);
}
//make_pair函数可以用来制作一个pair
template<class U, class V>
pair<U, V> make_pair(const U& u, const V& v) {
return pair<U, V>(u, v);
}
}
#endif // _UTILITY_H_