C++ Maps 被用作储存“关键字/值”对
常见的操作如下:
1、begin
语法:
iterator begin(); |
begin()函数返回一个迭代器指向map的第一个元素。
2、clear
语法:
void clear(); |
clear()函数删除map中的所有元素。
3、count
语法:
size_type count( const KEY_TYPE &key ); |
count()函数返回map中键值等于key的元素的个数。
4、empty
语法:
bool empty(); |
empty()函数返回真(true)如果map为空,否则返回假(false)。
5、end
语法:
iterator end(); |
end()函数返回一个迭代器指向map的尾部。
equal_range是C++ STL中的一种二分查找的算法,试图在已排序的[first,last)中寻找value,它返回一对迭代器i和j,其中i是在不破坏次序的前提下,value可插入的第一个位置(亦即lower_bound),j则是在不破坏次序的前提下,value可插入的最后一个位置(亦即upper_bound),因此,[i,j)内的每个元素都等同于value,而且[i,j)是[first,last)之中符合此一性质的最大子区间
如果以稍许不同的角度来思考equal_range,我们可把它想成是[first,last)内"与value等同"之所有元素形成的区间A,由于[fist,last)有序(sorted),所以我们知道"与value等同"之所有元素一定都相邻,于是,算法lower_bound返回区间A的第一个迭代器,算法upper_bound返回区间A的最后一个元素的下一个位置,算法equal_range则是以pair的形式将两者都返回
即使[fist,last)并未含有"与value等同"之任何元素,以上叙述仍然合理,这种情况下,"与value等同"之所有元素形成的,其实是一个空区间,在不破坏次序的情况下,只有一个位置可以插入value,而equal_range所返回的pair,其第一和第二(都是迭代器)皆指向该位置。
// map::equal_elements
#include <iostream>
#include <map>
using namespace std;
int main ()
{
map<char,int> mymap;
pair<map<char,int>::iterator,map<char,int>::iterator> ret;
mymap['a']=10;
mymap['b']=20;
mymap['c']=30;
ret = mymap.equal_range('b');
cout << "lower bound points to: ";
cout << ret.first->first << " => " << ret.first->second << endl;
cout << "upper bound points to: ";
cout << ret.second->first << " => " << ret.second->second << endl;
return 0;
}
6、erase
语法:
void erase( iterator pos ); void erase( iterator start, iterator end ); size_type erase( const KEY_TYPE &key ); |
erase()函数删除在pos位置的元素,或者删除在start和end之间的元素,或者删除那些值为key的所有元素。
7、find
语法:
iterator find( const KEY_TYPE &key ); |
find()函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器。
8、get_allocator
语法:
allocator_type get_allocator(); |
get_allocator()函数返回map的配置器。
9、insert
语法:
iterator insert( iterator pos, const pair<KEY_TYPE,VALUE_TYPE> &val ); void insert( input_iterator start, input_iterator end ); pair<iterator, bool> insert( const pair<KEY_TYPE,VALUE_TYPE> &val ); |
insert()函数:
10、key_comp
语法:
key_compare key_comp(); |
key_comp()函数返回一个比较key的函数。
11、lower_bound
语法:
iterator lower_bound( const KEY_TYPE &key ); |
lower_bound()函数返回一个迭代器,指向map中键值>=key的第一个元素。
12、max_size
语法:
size_type max_size(); |
max_size()函数返回map能够保存的最大元素个数。
13、rbegin
语法:
reverse_iterator rbegin(); |
rbegin()函数返回一个指向map尾部的逆向迭代器。
14、rend
语法:
reverse_iterator rend(); |
rend()函数返回一个指向map头部的逆向迭代器。
15、size
语法:
size_type size(); |
size()函数返回map中保存的元素个数。
16、swap
语法:
void swap( map &obj ); |
swap()交换obj和现map中的元素。
17、upper_bound
语法:
iterator upper_bound( const KEY_TYPE &key ); |
upper_bound()函数返回一个迭代器,指向map中键值>key的第一个元素。
18、value_comp
语法:
value_compare value_comp(); |
value_comp()函数返回一个比较元素value的函数。
关于key_comp与value_comp的用法如下:
这两东西就是用来比较两个值是否相等的函数或者仿函数,用在带排序功能的容器里,比如map和set。
比如set<XXX>,如果类型XXX支持operator <,那么默认会用<号作为比较的依据。如果类型XXX不支持<号,那么你可以自己提供一个函数或者仿函数实现比较功能,并作为set的模板参数,比如:set<XXX, MyComp>。
key_comp用来比较key大小,value_comp用来比较value大小。
对set来说,key和value是一回事,两个东西等价。
对map来说,比如map<XXX, YYY>,key的类型是XXX,value的类型是pair<XXX, YYY>。key_comp就是用来比较XXX类型的值的东西,value_comp就是用来比较pair<XXX,YYY>的东西。但是value_comp的比较方式跟key_comp是一样的。pair<XXX, YYY>里只有XXX会被比较,YYY不参与比较。