SGISTL源码探究-pair的实现
程序员文章站
2022-03-23 12:02:38
...
前言
本小节将对pair
进行源码分析,它经常用于map
的实现中,而我们下一节就会分析map
的源码,所以有必要在这一小节中,先把pair
分析了。 pair
的作用就是将两个数据合成一个,而这两个数据可以是不同的类型,这就非常符合key-value
这种键值对形式的存储了,接下来我们就进入到它的源码之中。
pair
的实现
pair
的实现代码很短,100行不到,但是对map
的实现确实提供了非常大的便利。它提供的操作也很简单,除了重载的操作符之外,提供的唯一接口就是make_pair
了,用过map
容器的应该都不陌生。
template <class T1, class T2>
//T1代表第一个元素的类型,T2代表第二个元素的类型
struct pair {
typedef T1 first_type;
typedef T2 second_type;
//first和second成员
T1 first;
T2 second;
//构造函数,使用初始化列表构造first还有second成员
pair() : first(T1()), second(T2()) {}
//构造函数
pair(const T1& a, const T2& b) : first(a), second(b) {}
//拷贝构造函数
#ifdef __STL_MEMBER_TEMPLATES
template <class U1, class U2>
pair(const pair<U1, U2>& p) : first(p.first), second(p.second) {}
#endif
};
//重载==操作符,需要first和second都相等,才返回true
template <class T1, class T2>
inline bool operator==(const pair<T1, T2>& x, const pair<T1, T2>& y) {
return x.first == y.first && x.second == y.second;
}
//重载<操作符,要求x.first<y.first或者在前者相同的情况下,比较second
template <class T1, class T2>
inline bool operator<(const pair<T1, T2>& x, const pair<T1, T2>& y) {
return x.first < y.first || (!(y.first < x.first) && x.second < y.second);
}
//make_pair函数,内部其实就是构造了一个pair,然后返回
template <class T1, class T2>
inline pair<T1, T2> make_pair(const T1& x, const T2& y) {
return pair<T1, T2>(x, y);
}
例子
#include <iostream>
#include <map>
using namespace std;
int main()
{
pair<int, string> pa1(3, "asdas");
pa1.first = 4;
cout << pa1.first << " " << pa1.second << endl;
pair<int, string> pa2(4, "asdab");
//先比较first,如果first相等,才比较second
cout << (pa1 < pa2) << endl;
pa1.second = "asdaa";
cout << (pa1 < pa2) << endl;
return 0;
}
小结
本小节针对pair
的实现进行了分析,它本身的实现很简单,但是对于map
来说是必不可少的,在下一小节中,我们可以看到map
中对它大量的使用。
上一篇: php怎么去掉数组中重复的元素
下一篇: php怎么移除第一个元素
推荐阅读
-
AbstractQueuedSynchronizer源码分析(ReentrantLock锁的实现)
-
拖拽式建站是怎么实现的,拖拽式h5建站源码
-
Vue源码解读之Component组件注册的实现
-
基于jquery实现的tab选项卡功能示例【附源码下载】
-
iOS实现换肤功能的简单处理框架(附源码)
-
jQuery实现的动态文字变化输出效果示例【附演示与demo源码下载】
-
jQuery插件FusionCharts实现的MSBar2D图效果示例【附demo源码】
-
jQuery插件FusionCharts实现的Marimekko图效果示例【附demo源码】
-
使用.Net Core + Vue + IdentityServer4 + Ocelot 实现一个简单的DEMO +源码
-
springboot2.0.3源码篇 - 自动配置的实现,发现也不是那么复杂