STL学习笔记(十三) 关联式容器 map 与 multimap

1  map的个性:

除了支持标准容器共性关联式容器共性外,还有以下特性:

不允许key 重复

元素是key,value对 所以插入的应该是pair
支持以key为下标[ ] 访问对应的value引用。如果key不存在,就新增一个key, value用零初始化
要注意如果value是自定义类型,一定要有个无参构造函数才能零初始化

key可以是任意类型,但key必须支持小于运算符,这样才能往红黑数里面放元素。


2 multimap的个性

除了支持 标准容器共性关联式容器共性外,还有以下特性:
 允许重复key
 元素是key value对 所以插入的是pair
 不支持方括号下标(因为key不唯一)

3 map示例


#include <iostream>
using namespace std;
#include <map>
#include "show.h"


/*  
template<typename T,typename U>
const pair<T,U>& mk_pair(const T& t,const U& u)
{
	return pair<T,U>(t,u);
}
//error: invalid initialization of non-const reference of type ‘
//std::pair<int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >&’ from a temporary of type ‘std::pair<int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >’
//我自己写这个函数时出了这个错误
//原因如下: 临时变量是const类型的,返回的引用必须是const 类型的引用
//临时变量会在返回值使用完后销毁  warning: returning reference to temporary  我认为是可以忽略的

//当然这个函数我只是练习下,c++库有自带的make_pair
*/
template<typename K,typename V>
ostream& operator<<(ostream& o,const pair<K,V> &p)
{
	return o << p.first << ":"  << p.second  ;
}

int main()
{
	map<int,string> mis;
	
	/* insert  方法*/
	//写法1 直接写pair临时变量
	mis.insert(pair<int,string>(3,"wanglong"));
	//写法2 使用c++函数
	mis.insert(make_pair(2,"zhugeliang"));
	//写法3 使用内部类型 value_type
	typedef map<int,string>::value_type Mvt;
	mis.insert(Mvt(1,"hejuju"));
	//写法4  利用访问下标key时 会自动创建新的键值对
	mis[4] = "lining"; //这个可以看作左边是创建,右边是修改值
	//同时这也是修改访问的一种方法
	
	//重复的
	mis.insert(make_pair(5,"zhongyulong"));
	mis.insert(make_pair(5,"furong")); //重复的key插入无效
	
	show(mis.begin(),mis.end());
	/*
	 出错了 因为map里每个元素是pair,所以要重定义pair的 << 运算符
	  no match for ‘operator<<’ in ‘std::cout << beg.std::_Rb_tree_iterator<_Tp>::operator++ [with _Tp 
	  = std::pair<const int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >](0).std::_Rb_tree_iterator<_Tp>::operator* [
	  with _Tp = std::pair<const int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]()’
	*/
	//输出值:1:hejuju 2:zhugeliang 3:wanglong 4:lining 5:zhongyulong  按key排序了
	
	
	/*修改 */
	mis[5] = "abc";
	show(mis.begin(),mis.end()); //1:hejuju 2:zhugeliang 3:wanglong 4:lining 5:abc  修改成功
	
	
	
}



4 multimap 示例


#include <map> //map头文件
#include <iostream>

#include <string>
using namespace std;
#include "show.h"

template<typename K,typename V>
ostream& operator<<(ostream& o,pair<K,V> &p)
{
	return o << p.first << ":" << p.second;
}


int main()
{
	typedef multimap<string,double> MSD;
	MSD m;
	m.insert(make_pair("chenyuxiang",3000));
	m.insert(make_pair("zhangyong",100000));
	m.insert(make_pair("zhangyong",220000));
	m.insert(make_pair("zhangyong",150000));
	m.insert(make_pair("liuaijie",120000));
	m.insert(make_pair("liuaijie",300000));
	m.insert(make_pair("chenyuxiang",1000000));
	show(m.begin(), m.end());
	/*
	 输出结果 
	  chenyuxiang:3 chenyuxiang:1e+06 liuaijie:120000 liuaijie:300000 zhangyong:100000 zhangyong:220000 zhangyong:150000 
	*/
	cout << "==========================" << endl;
	
	//统计每个人的营业额
	MSD::iterator ib= m.begin(),ie;
	MSD count;
	while(ib != m.end())
	{
		string name = ib->first;
		ie = m.upper_bound(name); //因为在关联容器里面的值是按key已排好序的,所有相同的都在这里
		double sum = 0;
		while(ib != ie)
		{
			sum += ib++->second;
		}
		count.insert(make_pair(name,sum));
	}
	
	show(count.begin(), count.end() );
}




SHOW.H

 #ifndef SHOW_H
#define SHOW_H

template<typename T> //T表示迭代器
void show(T beg,T end,char ch = ' ')
{
	while(beg != end)
	{
		cout << *beg++  << ch;
	}
	cout << endl;
}

#endif





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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值