1 map的个性:
不允许key 重复
元素是key,value对 所以插入的应该是pair支持以key为下标[ ] 访问对应的value引用。如果key不存在,就新增一个key, value用零初始化
要注意如果value是自定义类型,一定要有个无参构造函数才能零初始化
key可以是任意类型,但key必须支持小于运算符,这样才能往红黑数里面放元素。
2 multimap的个性
允许重复key
元素是key value对 所以插入的是pair
不支持方括号下标(因为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