4.3 map和multimap

使用map multimap必须包含头文件map

*:multimap

1)multimap定义

template<class Key,class Pred=less<Key>,class A=allocator<T>

class multimp

{

.....

typedef pair<const Key,T>value_type;    //value_type经常用到

......

};

multimap每个对象都是pair模板类的对象。元素first成员变量也称关键字,其类型为Key。second成员变量也称值,类型为T。multimap容器里的元素是按照关键字从小到大排序的,且允许多个关键字相同。

上面multimap中的value_type实际上表示容器中的元素的类型。c++允许在类的内部定义类型。

2)成员函数

3)例

//program 19.4.4.1 用multimap实现的学生信息管理程序
#include <iostream>
#include <map> //使用multimap需要包含此头文件
#include <string>
using namespace std;
class CStudent
{
public:
        struct CInfo //类的内部还可以定义类
        {
            int id;
            string name;
        };
        int score;
        CInfo info; //学生的其他信息
};
typedef multimap<int,CStudent::CInfo> MAP_STD;
int main()
{

    MAP_STD mp;
    CStudent st;
    string cmd;
    while( cin >> cmd ) {
        if( cmd == "Add") {
            cin >> st.info.name >> st.info.id >> st.score ;
            mp.insert(MAP_STD::value_type(st.score,st.info ));
        }
        else if( cmd == "Query" ){
            int score;
            cin >> score;
            MAP_STD::iterator p = mp.lower_bound (score);
            if( p!= mp.begin()) {
                --p;
                score = p->first; //比要查询分数低的最高分
                MAP_STD::iterator maxp = p;
                int maxId = p->second.id;
                for( ; p != mp.begin() && p->first == score; --p) {
                    //遍历所有成绩和score相等的学生
                    if( p->second.id > maxId ) {
                        maxp = p;
                        maxId = p->second.id ;
                    }
                }
                if( p->first == score) { //如果上面循环是因为 p == mp.begin()
                                           // 而终止,则p指向的元素还要处理
                    if( p->second.id  > maxId ) {
                        maxp = p;
                        maxId = p->second.id ;
                    }
                }
                cout << maxp->second.name << " " << maxp->second.id << " "
                                          << maxp->first << endl;
            }
            else //lower_bound的结果就是 begin,说明没人分数比查询分数低
                cout << "Nobody" << endl;
        }
    }
    return 0;
}  

**:map

1)定义

template<class Key,class T,class Pred=less<Key>,class A=allocator<T>>

class map {

......

typedef pair<const Key,T>value_type;

.......

};

map 和multimap十分相似,区别在于,map容器中的元素,关键字不能重复。

multimap有的成员函数map都有,此外map还有成员函数operator[]:

T&operator[](Key k);

该成员函数返回first值为k的元素的second部分。如果容器中没有元素的first值等于k,则自动添加值为k的元素;如果该元素的成员变量是一个对象,则用无参构造函数对其初始化。

2)例

//program 19.4.5.1.cpp  map的用法示例
#include <iostream>
#include <map>  //使用map需要包含此头文件
using namespace std;
template <class T1,class T2>
ostream & operator <<( ostream & o,const pair<T1,T2> & p)
{ //将pair对象输出为 (first,second)形式
    o << "(" << p.first  << "," << p.second << ")";
    return o;
}
template<class T>
void Print( T first,T last)
{//打印区间[first,last)
    for( ; first != last; ++ first)
        cout <<  * first << " ";
    cout << endl;
}
typedef map<int,double,greater<int> > MYMAP; //此容器关键字是整型,
                                            //元素按关键字从大到小排序
int main()
{
    MYMAP mp;
    mp.insert(MYMAP::value_type(15,2.7));
    pair<MYMAP::iterator,bool> p = mp.insert(make_pair(15,99.3));
    if( ! p.second )
        cout << * (p.first) << " already exists" << endl; //会输出
    cout << "1) " << mp.count(15) << endl; //输出 1) 1
    mp.insert(make_pair(20,9.3));
    cout << "2) " << mp[40] << endl;//如果没有关键字为40的元素,则插入一个
    cout << "3) ";Print(mp.begin(),mp.end());//输出:3) (40,0)(20,9.3)(15,2.7)
    mp[15] = 6.28; //把关键字为15的元素值改成6.28
    mp[17] = 3.14; //插入关键字为17的元素,并将其值设为3.14
    cout << "4) ";Print(mp.begin(),mp.end());
    return 0;
}
时间: 2024-12-29 11:12:32

4.3 map和multimap的相关文章

详解map、multimap、unordered_map、unordered_multimap

详解map.multimap.unordered_map.unordered_multimap 相信有不少同学和我一样刚接触C++ STL,被其深深吸引.但是想弄懂每个模板类不是一个容易事.大家应该对vector.list.stack.queue等类比较了解了,所以今天详细介绍下几个很常用很强大但有点不太好懂的类map.multimap.unordered_map.unordered_multimap.乍一看都差不多都是什么map,但这肯定有所不同.下面就在一个一个讲解的同时,让大家了解这四个类

STL标准库-容器-map和multimap

摘要: 摘要: 技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 map与multimap为关联容器,结构如下 map底层实现依然是rb_tree 他的data可以改,但是key不能改,因此map仍然具有自动排序的功能 我们无法使用迭代器改变元素的key(const key),但是可以改变元素的data. map的key必须独一无二,multimap的key可以重复 map的定义函数 template <typename _Key, typename _Tp, typena

【C++ STL】Map和Multimap

1.结构 Map和multimap将key/value pair(键值/实值 队组)当作元素,进行管理.他们根据key的排序准则将元素排序.multimap允许重复元素,map不允许. 元素要求: key/value必须具有assigned(可赋值)和copyable(可复制的)性质. 对于排序而言,key必须具是comparable(可比较的). 2.能力 典型情况下,set,multisets,map,multimap使用相同的内部结构,因此可以将set和multiset当成特殊的map和m

GEEK学习笔记— —STL容器map和multimap

简介 在头文件<map> 中定义 namespace std { template <typename Key, typename T, typename Compare = less<Key>, typename Allocator = allocator<pair<const Key,T> > > class map; template <typename Key, typename T, typename Compare = less

C++ STL map和multimap

1.map简介 map 是关联容器的一种,map 的每个元素都分为关键字和值两部分,容器中的元素是按关键字排序的,并且不允许有多个元素的关键字相同. 注意:不能直接修改 map 容器中的关键字.因为 map 中的元素是按照关键字排序的,当关键字被修改后,容器并不会自动重新调整顺序,于是容器的有序性就会被破坏,再在其上进行查找等操作就会得到错误的结果.要使用 map,必须包含头文件 <map>. 2.map的定义 template < class Key, class T, class P

map和multimap映射容器

map容器 map所处理的数据与数据库表具有键值的记录非常相似,在键值与映射数据之间,建立一个数学上的映射关系.map容器的数据结构仍然採用红黑树进行管理.插入的元素键值不同意反复,所使用的结点元素的比較函数仅仅对元素的键值进行比較,元素的各项数据能够通过键值检索出来.对于键值和映射数据.能够通过pair封装成一个结构对象.map要做的就是将这个pair对象插入到红黑树中,同一时候也须要提供一个仅使用键值进行比較的函数对象,将它传递给红黑树.此时就能够利用红黑树的操作将map元素插入到二叉树的正

Guava - List to Map and Multimap

Get Ids from List<SomeObject> public static List<Long> getVendorItemIds(List<VendorItemDdp> vendorItems) {     return Lists.transform(vendorItems, indexVendorItemId()); } public static Function<VendorItemDdp, Long> indexVendorItemI

STL之六:map/multimap用法详解

转载于:http://blog.csdn.net/longshengguoji/article/details/8547007 map/multimap 使用map/multimap之前要加入头文件#include<map>,map和multimap将key/value当作元素,进行管理.它们可根据key的排序准则自动将元素排序.multimap允许重复元素,map不允许重复元素. map和multimap内部的数据结构也是平衡二叉树. map和multimap根据元素的key自动对元素进行排

stuff about set multiset map multimap

A lot of interviewers like to ask the candidates the difference between set and multiset(map and multimap).What does multi actually mean?Multi-container could have duplicate element.Check the code below. 1 /*******************************************