浅学STL(4)——associative container

今天简单看一下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 
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值