除了支持标准容器共性和关联式容器共性外,还有以下特性:
不允许key 重复
元素是key,value对 所以插入的应该是pairkey可以是任意类型,但key必须支持小于运算符,这样才能往红黑数里面放元素。
#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 修改成功 }
#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() ); }
#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