map和set
在之前的学习中,我们接触了STL中的部分容器,比如:vector,list,deque,这些都是序列式容器,下面将要介绍的是关联式容器map和set,与序列式不同的是,关联式容器里面存储的是**<key, value>**结构的键值对,在数据检索时比序列式容器效率更高。
键值对
包含两个成员变量key和value,key代表键值,value代表key对应的信息。例如:现在要建立一个英汉互译的字典,则可以将key值设定为英语单词,value设定为中文释义,就能够在字典中找到英语单词对应的中文释义。
STL中关于键值对的定义
template <class T1, class T2>
struct pair
{
typedef T1 first_type;
typedef T2 second_type;
T1 first;
T2 second;
pair(): first(T1()), second(T2())
{}
pair(const T1& a, const T2& b): first(a), second(b)
{}
};
set和multiset
set的使用
set是按照一定次序存储元素的容器,在set中元素会自动排序,且元素不能重复(因此可以用set进行去重),set中的元素默认按照小于来比较,在set中查找元素的时间复杂度是logN。set中的元素不允许修改,但是可以通过容器插入或者删除。set只存储value元素,但是在底层存储的是真正的键值对<value,value>。
set的迭代器
begin():返回set中起始位置元素的迭代器
end():返回set中最后一个元素后面的迭代器
rbegin():返回set第一个元素的反向迭代器,即end
rend():返回set最后一个元素下一个元素的反向迭代器,即begin
set的函数
empty():判断set是否为空
size():返回set中元素的个数
insert(const value_type& x):在set中插入元素x,实际插入的是键值对<x,x>,如果插入成功,返回<该元素的位置,true>否则返回<x在set中的位置,false>
erase( iterator position):删除set中position位置的元素
erase( const key_type& x):删除值为x的元素,返回删除元素的个数
clear():将set中的元素清空
set的使用例子:
#include <set>
void TestSet()
{
// 用数组array中的元素构造set
int array[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0, 1, 3, 5, 7, 9, 2, 4,
6, 8, 0 };
set<int> s(array, array+sizeof(array)/sizeof(array));
cout << s.size() << endl;
// 正向打印set中的元素,从打印结果中可以看出:set可去重
for (auto& e : s)
cout << e << " ";
cout << endl;
// 使用迭代器逆向打印set中的元素
for (auto it = s.rbegin(); it != s.rend(); ++it)
cout << *it << " ";
cout << endl;
// set中值为3的元素出现了几次
cout << s.count(3) << endl;
}
multiset和set的区别就是能够存放重复的元素,其他操作跟set差不多
map和multimap
######map的使用
map中存储的是真正的键值对<key,value>,map中的元素也是有序的,总是按照键值key进行排序,默认按照小于进行比较排序。
map的迭代器
begin():返回map中起始位置元素的迭代器
end():返回map中最后一个元素后面的迭代器
rbegin():返回map第一个元素的反向迭代器,即end
rend():返回map最后一个元素下一个元素的反向迭代器,即begin
map的函数
empty():判断map是否为空
size():返回map中元素的个数
operator[] (const key_type& k):返回key对应的value,当key不在map中时会直接构造键值对后插入map
insert(const value_type& x):在map中插入键值对x,注意x是键值对,如果插入成功,返回<该元素的位置,true>否则返回<x在map中的位置,false>
erase( iterator position ):删除position位置上的元素
erase(const key_type& x):删除值为x的元素,返回删除元素的个数
count(const key_type& x):返回key为x的键值在map中的个数注意map中key是唯一的,因此该函数的返回值要么为0,要么为1,因此也可以用该函数来检测一个key是否在map中
#include <string>
#include <map>
void TestMap()
{
map<string, string> m;
m.insert(pair<string, string>("peach", "桃子"));
m.insert(make_pair("banan", "香蕉"));
m["apple"] = "苹果";
cout << m.size() << endl;
for (auto& e : m)
cout << e.first << "--->" << e.second << endl;
cout << endl;
m.erase("apple");
if (1 == m.count("apple"))
cout << "apple还在" << endl;
else
cout << "apple被吃了" << endl;
}
map中的key是唯一的,并且不能修改
######multimap和map的区别就是multimap允许key值重复,其他操作跟map差不多