今天简单看一下map,set.
作为关联容器,map,set支持高效的关键字查找和访问。
map
map里面存的是一些key-value对,其中key起到索引的作用, 而value则表示对应的值。
比如字典就是一个很好使用map的例子,把单词当作key,解释当作value。
(记得校赛有道单词的题,当时疯狂拿结构体做,现在想来,呵呵( ̄▽ ̄)~*,小菜一碟)
其实map类型也常称做关联数组,它和一般的数组类似,可以认为它key就是数组的下标(只不过不必是整数),value则是数组存的值,还是上面的字典例子,比如有某个单词为right,它的其中一个解释为右边的,我们就可以使用类似数组的方式a[“right”]访问到“右边的”这个解释。
set
set里面每个元素只存有一个key,它支持高效的关键字查询操作,比如检查一个关键字是否在set中或者在
某些文本处理过程中可用set保存想要忽略的单词,并且set自行排序,没有重复元素,可以用来去重。
代码解释一下:
set:
#include<stdio.h>
#include<set>//树形结构,平衡树 ,没有重复元素
/*
Associative Container
Always sorted,default critreia is <(默认从小到大)
No push_back(),push_front()
*/
using namespace std;
int main()
{
set<int> myset;
myset.insert(3);//myset:{3}
myset.insert(1);//myset:{1,3}
myset.insert(7);//myset:{1,3,7},O(log(n))
set<int>::iterator it;
it=myset.find(7);//O(log(n)),指向7
// sequence container没有find() 成员函数
pair<set<int>::iterator,bool> ret;
ret=myset.insert(3);//没有新元素插入,因为重复 ,这里insert函数的返回值就是一个pair
if(ret.second==false) it=ret.first;//现在指向3
myset.insert(it,9);//myset:{1,3,7,9} O(log(n)) => O(1),it是指向3的
myset.erase(it);//myset:{1,7,9}
myset.erase(7);//myset:{1,9}
// multiset 是允许相同元素存在的 set ,在set头文件中
multiset<int> mymultiset;
// set/multiset 元素的值不能被改变(const) 是只读的
/*
1) 查询 O(log(n))
2) 调用相对vector和deque有点慢
3) 不能随机访问,没有[]操作符
*/
}
map:
#include<stdio.h>
#include<iostream>
#include<map>
//key不能重复
using namespace std;
int main()
{
map<char,int> mymap;
mymap.insert( pair<char,int>('a',100) );
mymap.insert( make_pair('z',200));
map<char,int>::iterator it=mymap.begin();
mymap.insert(it,pair<char,int>('b',300));// "it" is a hint,('b',300)插入在it之前
it=mymap.find('z');// O(log(n))
//展示map中的内容
for(it=mymap.begin();it!=mymap.end();it++)
cout<<(*it).first<<"=>"<<(*it).second<<endl;
//multimap key可以重复
multimap<char,int> mymap1;
// map/multimap:key不可以改变(const)
// type of *it: pair<const char,int>
//(*it).first='d'; //error
}