map简单分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28110727/article/details/80474256

map中数据的插入操作

//方式1:map.insert(pair<T1,T2>());
//方式2:map.insert(map<T1,T2>::value_type());
//方式3:map[key] = value;
上面两种方式和下面的方式,虽然都可以实现数据的插入操作,但在数据的插入性上涉及集合的唯一性。即当map中有这个关键字时,insert操作是插入不了数据的,但是使用数组的方式,会覆盖之前的数据。
pair<map<T1,T2>::iterator, bool> insert_pair;
insert_pair = map.insert(pair<T1,T2>());
通过insert_pair中的第二个变量来知道是否插入成功.

map的查找

方式1:通过使用count函数来判断关键字是否出现,缺点,无法定位数据所在的位置。其返回值要么为0,要么为1
方式2:通过find函数来定位数据出现的位置。返回一个迭代器。找到,返回数据所在位置的迭代器。如果数据不存在,返回的迭代器与end函数返回的迭代器相等。

map函数的定义:

template<class Key, class Vlaue, class Compare = less<key>, class Allocator = allocator<pair<Key,value>>> class_map;
less为STL模板中的一个函数对象,其实现如下。
template<class T>struct less : binary_function<T,T,bool>
{
bool operator() (const T&a , const T& b) const
{
return x<y;
}
}
我们可以重定义函数对象来实现自定义的排序。
template<class T1, class T2>
{
typedef T1 first_type;
typedef T2 second_type;

T1 first;
T2 second;

pair():first(T1()),second(T2()){}
pair(const T1& x, const T2& y):first(x),second(y){}
template<class T, class U>
pair(const pair<T,U>& other):first(other.first),second(other.second){}
}
在utility头文件中,为pair重载了<运算符,具体实现如下:
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);
}
第一处很好理解,即x的key小于y的key.
第二处为第一处不满足的条件下再来执行,即前提条件为__x.first >= __y.first,而!(__y.first < __x.first)表示__y.first>=__x.first,即为当__x的key等于__y的key,在去比较__x的值和__y的值。

为什么不直接写出__x.first == __y.first,前面我们了解到map中的key必须实现<运算符的重载,但是并没有保证==运算符也被重载了。不得不说,STL的代码十分严谨,希望自己在以后的时间去好好研读。有时间也会开一个专栏吧。







猜你喜欢

转载自blog.csdn.net/qq_28110727/article/details/80474256