关联容器map, multimap

map/multimap里放着的都是pair模板类的对象,且按first从小到大排序。

pair 模板:

template <class _T1, class _T2>

struct pair

{

typedef _T1 first_type;

typedef _T2 second_type;

_T1 first;

_T2 second;

pair():first(),second(){};

pair(const _T1 &__a, const _T2 & __b):first(__a),second(__b){}

template<class _U1, class _U2>

pair(const pair<_U1, _U2>& __p): first(__p.first),second(__p.second){} //拷贝构造函数

}

  • multimap中的元素由<关键字,值>组成,每个元素是一个pair对象,关键字就是first成员变量,其类型是key.
  • multimap中允许多个元素的关键字相同。元素按照first成员变量从小到大排列,缺省情况下用less<Key>定义关键字的“小于”关系。

下面是关于multimap的一个小例子:

#include <iostream>
#include <map>
using namespace std;

int main()
{
    typedef multimap<int, double, less<int>> mmid;
    mmid pairs;
    cout << "1)" << pairs.count(15) << endl;
    //map中定义typedef value_type pair<const key,T>,模板类为pair<int,double>
    pairs.insert(mmid::value_type(2, 3.4));
    cout << "2)" << pairs.count(2) << endl;
    pairs.insert(mmid::value_type(1, 2.4));
    for (mmid::iterator it = pairs.begin(); it != pairs.end(); it++)
    {
        cout << "(" << (*it).first << "," << (*it).second << ")" << " ";
    }
    cout << endl;
    return 0;
}

运行结果:

下面是一个学生成绩录入和查询系统,应用了multimap的例子,通过查找输出系统中比查询分数低的最大学生ID号的学生信息。

#include <iostream>
#include <map>
#include <string>

using namespace std;

class Student
{
public :
    int score;
    struct Info
    {
        int ID;
        string name;
    };
    Info info;
};

typedef multimap<int, Student::Info> MAP;

int main()
{
    MAP map;
    Student student;
    string cmd;
    while (cin >> cmd)
    {
        if (cmd == "add")
        {
            cin >> student.score >> student.info.ID >> student.info.name;
            map.insert(MAP::value_type(student.score, student.info));
        }
        else if (cmd == "query")
        {
            int sco = 0;
            cin >> sco;
            MAP::iterator it;
            it = map.lower_bound(sco);
            if (it != map.begin())
            {
                it--;
                sco = it->first;
                int maxid = (*it).second.ID;
                MAP::iterator maxp = it;
                for (; it != map.begin() && (*it).first == sco; it--)
                {
                    if ((*it).second.ID > maxid)
                    {
                        maxid = (*it).second.ID;
                        maxp = it;
                    }
                }
                if (it == map.begin())
                {
                    if (maxid < it->second.ID)
                    {
                        maxid = it->second.ID;
                        maxp = it;
                    }
                }
                cout << maxp->first << " " << maxp->second.ID << " " << maxp->second.name << endl;
            }
            else
            {
                cout << "Not find !" << endl;
            }
        }
    }
    return 0;
}

运行结果:

参考链接:

https://www.coursera.org/learn/cpp-chengxu-sheji

时间: 2024-12-19 00:28:05

关联容器map, multimap的相关文章

C++关联容器&lt;map&gt;简单总结

C++关联容器<map>简单总结 map提供大小可变的关联容器,基于关联键值高效检索元素值.当你处理键值对的数据是,都可以考虑使用map关联容器. 特点: 大小可变的关联容器,基于关联键值高效检索元素值. 可逆,因为它提供双向迭代器来访问其元素. 有序,因为它的元素根据指定的比较函数按键值排序. 唯一. 因为它的每个元素必须具有唯一键. 关联容器对,因为它的元素数据值与其键值不同. 模板类,因为它提供的功能是一般性的功能,与元素或键类型无关. 用于元素和键的数据类型作为类模板以及比较函数和分配

STL 笔记(二) 关联容器 map、set、multimap 和 multimap

STL 关联容器简单介绍 关联容器即 key-value 键值对容器,依靠 key 来存储和读取元素. 在 STL 中,有四种关联容器,各自是: map 键值对 key-value 存储,key 不可反复,即一个 key 仅仅能相应一个 value, 相应头文件<map> multimap 键值对 key-value 存储,key 能够反复,即一个 key 能够相应多个 value, 相应头文件<map> set 仅仅有 key, key 不可反复,相应头文件<set>

STL 笔记(二): 关联容器 map、set、multimap 和 multimap

STL 关联容器简介 关联容器即 key-value 键值对容器,依靠 key 来存储和读取元素.在 STL 中,有四种关联容器,分别是: map 键值对 key-value 存储,key 不可重复,即一个 key 只能对应一个 value, 对应头文件<map> multimap 键值对 key-value 存储,key 可以重复,即一个 key 可以对应多个 value, 对应头文件<map> set 只有 key, key 不可重复,对应头文件<set> mult

关联容器——map、set

map类型通常被称为关联数组,与正常数组类似,不同之处在于其下标不必是整数.我们通过一个关键字而不是位置来查找值(键值对). 与之相对,set就是关键字的简单集合.当只是想知道一个值是否存在时,set是最有用的. 类似顺序容器,关联容器也是模板,为了定义一个map,我们必须指定关键字和值得类型.例:map<string,int>test;一个test的空map,关键字是string.值是int的.set<string> e={"hello"};设置关键字集合,类

关联容器map的使用

map容器中的元素是一些关键字-值(key-value)对.map全称为有序的关键字不可重复的map,可以称之为关联数组,map通过关键字而非位置来查找值. 出了map外,还有允许关键字重复的multimap.无序的(由哈希函数组织的)关键字不可重复出现的unordered_map和无序的关键字可重复出现的unordered_multimap. 1 map的定义和初始化 在定义和初始化上,map和顺序容器vector并没有很大区别,甚至大多数初始化方式是一样的. 2 赋值 map的赋值可以有同类

关联容器map(红黑树,key/value)

字符串或串(String)是由数字.字母.下划线组成的一串字符.一般记为 s="a1a2···an"(n>=0).它是编程语言中表示文本的数据类型.在程序设计中,字符串(string)为符号或数值的一个连续序列,字符串在存储上类似字符数组,所以它每一位的单个元素都是可以提取的,如s="abcdefghij",则s[1]="a",s[10]="j" //线性序列,里面只存了一个元素,map存的是键值对 vector  [2

C++拾遗(七)——关联容器

关联容器(Associative containers)支持通过键来高效地查找和读取元素.两个基本的关联容器类型是 map 和set.map 的元素以键-值(key-value)对的形式组织:键用作元素在 map 中的索引,而值则表示所存储和读取的数据.set仅包含一个键,并有效地支持关于某个键是否存在的查询.set 和 map 类型的对象所包含的元素都具有不同的键,不允许为同一个键添加第二个元素.如果一个键必须对应多个实例,则需使用 multimap 或 multiset,这两种类型允许多个元

CH11 关联容器

关联容器与顺序容器有着根本的不同:关联容器中的元素是按关键字来保存和访问的,而顺序容器是按它们在容器中的位置来顺序保存和访问的.两个主要的关联容器:map和set map 中的元素的是一个key-value对:关键字是用来索引值关联的数据.set:每个关键字值包含一个关键字. 关联容器类型: map 保存key-value  map<key,value> set 保存关键字key set<key> multimap 关键字可以重复出现的map multiset 关键字可以重复出现的

【足迹C++primer】37、关联容器概述

关联容器概述 关联容器不支持顺序容器的位置操作,如push_back或push_front 也不支持构造函数或插入操作这些接受一个元素值和一个数量值的操作. 定义关联容器 这里注意哦,我这是一个函数,里面关联容器map是包含在头文件map中的!!! 还有就是set是包含在头文件set中的,string是包含在头文件string中的!!! //关联容器初始化 void fun1() { map<string, size_t> word_count; //空容器 //列表初始化 set<st