欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

tinystl实现(第七步:Utility.h)

程序员文章站 2022-05-24 18:52:39
...

经过长时间的学习终于可以开始tinystl的仿(chao)写工作了,本文参考了这位大佬的github,坦白讲我只是补充了注释,因为tinystl的代码真的非常经典而我又没什么这种大型项目的经验,所以只能这样做,不过相信能够有助于大家的学习
#强烈建议按顺序阅读本专栏
在本篇中我们实现了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);
	}
	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_

相关标签: tinystl stl c++