笔记:C++STL关联容器之map

C++STL的map是一个类模板,属于关联容器,提供一对一的hash,自动建立key->value的映射,内部由红黑树实现。

以一个map常用的场景阐述map的用法

1.  实例化map,  关键字类型为string,值类型为int,利用map的关键字不可重复性,统计关键字(单词)出现的次数

#include<map>
typedef map<string, int> MAP_STRING_CINT;

MAP_STRING_CINT WordCount;

2.  map元素插入的方法:

1)以[key]的方式插入(若key存在,则修改,反之插入);

2)使用map.insert()函数以pair的形式插入:

Map.insert(make_pair(key, value));
或者
Map.insert(pair<keytype, valuetype>(key, value));
或者
Map.insert(map<keytype, valuetype>::value_type(key, value));

为了方便修改,使用[]方法:

typedef vector<string> VEC_STRING;	

VEC_STRING strs = {"aw","aw","ber","cd","ber","aw","cd","dhg","cd","aw"};
for(int i=0;i< strs.size();i++)
    WordCount[strs[i]]++;

3. map是按key有序的(从小到大),所以WordCount按照单词首字母有序,如果我们想得到单词出现次数有序的,需要对value排序。借助vector。

typedef pair<string, int> PAIR_STRING_INT;
typedef vector<PAIR_STRING_INT> VEC_PAIR_STRING_CINT;
typedef vector<PAIR_STRING_INT>* pVEC_PAIR_STRING_CINT;

int compare(const PAIR_STRING_INT x, const PAIR_STRING_INT y) {
	return x.second > y.second;  //按value从大到小排序
}
void sortMapbyValue(MAP_STRING_CINT WordCount, pVEC_PAIR_STRING_CINT pVec) {

	for (MAP_STRING_CINT::iterator iter = WordCount.begin(); iter != WordCount.end(); iter++) {
		pVec->push_back(make_pair(iter->first,iter->second));  //vetcor允许元素在尾部快速插入
	}

	sort(pVec->begin(), pVec->end(), compare);  //排序,使用自定义比较函数compare,参数类型为vector的元素类型pair<string, int>
}

//
pVEC_PAIR_STRING_CINT pVec = new VEC_PAIR_STRING_CINT();
sortMapbyValue(WordCount,pVec);
for(VEC_PAIR_STRING_CINT::iterator iter = pVec->begin(); iter !=pVec->end(); iter++)
	std::cout << iter->first << ":" << iter->second << std::endl;

4. 使用map.find()函数按key查找元素, 若存在,返回key->value的pair,若不存在,返回map.end();

map重载了[]和at()函数,也可以使用,map.[key]和map.at(key)来查找得到key所对应的value, 但不安全。

int cnt;

MAP_STRING_CINT::iterator iter = WordCount.find("cdr");
if (iter != WordCount.end())
	cnt = iter->second ;

cnt = WordCount.at("cdr");  // 当查找关键字"cdr"在map中不存在时,引发异常
cnt = WordCount["cdr"];     // 同上

5. 删除和清空

//删除和清空
int sec = WordCount.erase("cd"); //删除失败则返回1, 关键字不存在或者删除失败返回0
WordCount.clear();

写在最后:

Elevenoo is a smart and beautiful girl . 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值