map和set

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差不多

  • 8
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值