C++ Primer(第五版)学习笔记_9_标准模板库_multimap多重映照容器

C++ Primer(第五版)学习笔记_9_标准模板库_multimap多重映照容器

多重映照容器multimap与map结构基本相同,但由于重复键值存在,所以multimap的元素插入、删除、查找都与map的方法不相同。

1、multimap对象创建、元素插入

插入元素时,需要使用insert()方法和类似pair<string,double>(“Jack”, 300.5)的元素结构。可以看到,重复的元素是按照插入的先后顺序排序的。

#include <iostream>
#include <stdio.h>
#include <string>
#include <map>

using namespace std;

int main()
{
   multimap<string, double> str;

   //插入元素
   str.insert(pair<string, double>("Jack", 400));
   str.insert(pair<string, double>("Kity", 200));
   str.insert(pair<string, double>("Jack", 300.5));
   str.insert(pair<string, double>("Memi", 500));
   str.insert(pair<string, double>("Jack", 306));

   for(multimap<string, double>::iterator iter = str.begin(); iter !=str.end(); iter++)
       cout << (*iter).first << " : " <<(*iter).second << endl;
   return 0;
}

运行结果:

Jack : 400

Jack : 300.5

Jack : 306

Kity : 200

Memi : 500

2、元素的删除:erase()和clear()

删除某个键值采用erase()方法,当有重复的键值,会一次性都删除。使用clear()方法可将multimap容器中的元素清空。

#include <iostream>
#include <stdio.h>
#include <string>
#include <map>

using namespace std;

int main()
{
    multimap<string, double> str;

    //插入元素
    str.insert(pair<string, double>("Jack", 400));
    str.insert(pair<string, double>("Kity", 200));
    str.insert(pair<string, double>("Jack", 300.5));
    str.insert(pair<string, double>("Memi", 500));
    str.insert(pair<string, double>("Jack", 306));

    for(multimap<string, double>::iterator iter = str.begin(); iter !=str.end(); iter++)
        cout << (*iter).first<< ": "<< (*iter).second << endl;

    //删除Jack
    int n = str.erase("Jack");
    cout << "删除元素个数: " << n <<endl;
    cout << "删除后的元素: " << endl;
    for(multimap<string, double>::iterator iter = str.begin(); iter !=str.end(); iter++)
        cout << (*iter).first<< ": "<< (*iter).second << endl;

    //清空
    str.clear();
    if(str.size() == 0)
        cout << "元素为空" << endl;
    else
        cout << "元素个数为:" << endl;
    return 0;
}

运行结果:

Jack : 400

Jack : 300.5

Jack : 306

Kity : 200

Memi : 500

删除元素个数:3

删除后的元素:

Kity : 200

Memi : 500

元素为空

3、元素的查找

由于multimap存在重复的键值,所以find()方法只返回第一个元素的迭代器位置。如果没有找到该键值,则返回end()迭代器位置。

#include <iostream>
#include <stdio.h>
#include <string>
#include <map>

using namespace std;

int main()
{
   multimap<string, double> str;

   //插入元素
   str.insert(pair<string, double>("Jack", 400));
   str.insert(pair<string, double>("Kity", 200));
   str.insert(pair<string, double>("Jack", 300.5));
   str.insert(pair<string, double>("Memi", 500));
   str.insert(pair<string, double>("Jack", 306));

   for(multimap<string, double>::iterator iter = str.begin(); iter !=str.end(); iter++)
       cout << (*iter).first << " : " <<(*iter).second << endl;

   //查找键值
   cout << "找到的结果: ";
   multimap<string, double>::iterator iter;
   iter = str.find("Jack");
   if(iter != str.end())
       cout << (*iter).first << " : " <<(*iter).second << endl;
   else
       cout << "没有找到结果" << endl;

   cout << "找到的结果: ";
   iter = str.find("Nacy");
   if(iter != str.end())
       cout << (*iter).first << " : " <<(*iter).second << endl;
   else
       cout << "没有找到结果" << endl;
   return 0;
}

运行结果:

Jack : 400

Jack : 300.5

Jack : 306

Kity : 200

Memi : 500

找到的结果:Jack :400

找到的结果:没有找到结果

4、自定义比较函数

默认情况下,按照键值由小到大的顺序插入元素。由于内部数据结构都是红黑树,因此编写比较函数与map是一致的。编写方法有两种,

(1)如果元素不是结构体,那么可以编写比较函数。下面实现键值由大到小的顺序将元素插入mutlmap中:

#include <iostream>
#include <stdio.h>
#include <string>
#include <map>

using namespace std;

struct myComp
{
    bool operator()(string a, string b)
    {
       return a > b;
    }
};

int main()
{
    multimap<string, double, myComp> str;

    //插入元素
    str.insert(pair<string, double>("Jack", 400));
    str.insert(pair<string, double>("Kity", 200));
    str.insert(pair<string, double>("Jack", 300.5));
    str.insert(pair<string, double>("Memi", 500));
    str.insert(pair<string, double>("Jack", 306));

    for(multimap<string, double, myComp>::iterator iter = str.begin(); iter !=str.end(); iter++)
        cout << (*iter).first<< ": "<< (*iter).second << endl;
    return 0;

}

运行结果:

Memi : 500

Kity : 200

Jack : 400

Jack : 300.5

Jack : 306

(2)如果元素是结构体,那么,可以直接把比较函数写在结构体里面。

#include <iostream>
#include <stdio.h>
#include <string>
#include <map>

using namespace std;

struct Info
{
  string name;
  float score;
  bool operator < (Info a) const
  {
    return a.score < score;
  }
};

int main()
{
    multimap<Info, double> str;

    //插入元素
    Info info;
    info.name = "Jack";
    info.score = 60;
    str.insert(pair<Info, double>(info, 400));

    info.name = "Bomi";
    info.score = 80;
    str.insert(pair<Info, double>(info, 200));

    info.name = "Peti";
    info.score = 80;
    str.insert(pair<Info, double>(info, 300.5));

    info.name = "Kity";
    info.score = 70;
    str.insert(pair<Info, double>(info, 500));

    for(multimap<Info, double>::iterator iter = str.begin(); iter !=str.end(); iter++)
    {
        cout << (*iter).second<< ": ";
        cout <<((*iter).first).name << " " << ((*iter).first).score << endl;
    }

    return 0;

}

运行结果:

200 : Bomi 80

300.5 : Peti 80

500 : Kity 70

400 : Jack 60

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-08 00:17:34

C++ Primer(第五版)学习笔记_9_标准模板库_multimap多重映照容器的相关文章

C++ Primer(第五版)学习笔记_7_标准模板库_multiset多重集合容器

C++ Primer(第五版)学习笔记_7_标准模板库_multiset多重集合容器 多重集合容器multiset与set一样,也是使用红黑树来组织元素数据的,唯一不用的是,multiset允许重复的元素键值插入.其结构示意图如下: 1.multiset元素插入 #include <iostream> #include <stdio.h> #include <vector> #include <set> #include <string> usi

C++ Primer(第五版)学习笔记_5_标准模板库string(2)

C++ Primer(第五版)学习笔记_5_标准模板库string(2) 10.搜索string对象的元素或子串 采用find()方法可查找字符串中的第一个字符元素(char, 用单引号界定)或者子串(用双引号界定):如果查到,则返回下标值(从0开始计数),如果查不到,则返回一个很大的数string:npos(即:4294967295). #include <iostream> #include <stdio.h> #include <string> using nam

C++ Primer(第五版)学习笔记_3_标准模板库vector(2)

C++ Primer(第五版)学习笔记_3_标准模板库vector(2) 欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢 6.元素的插入 insert()方法可以在vector对象的任意位置前插入一个新的元素,同时,vector自动扩张一个元素空间,插入位置后的所有元素依次向后挪动一个位置. 要注意的是,insert()方法要求插入的位置,是元素的迭代器位置,而不是元素的下标. #include <iostream> #include <vector> using namespa

C++ Primer(第五版)学习笔记_1_标准模板库--快速入门

C++ Primer(第五版)学习笔记_1_标准模板库--快速入门 欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢 标准模板库(STL)提供三种类型的组件:容器.迭代器和算法,他们都支持泛型程序设计标准. 容器主要有两类:顺序容器和关联容器.顺序容器(vector.list.deque和string等)是一系列元素的有序集合.关联容器(set.multiset.map和multimap)包含查找元素的键值. 迭代器的作用是遍历容器. STL算法库包含四类算法:排序算法.不可变序算法.变序性算法

C++ Primer(第五版)学习笔记_2_标准模板库vector(1)

C++ Primer(第五版)学习笔记_2_标准模板库vector(1) 欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢 向量容器vector不但能像数组一样进行随机访问,还能在尾部插入元素,完全可以替代数组. 值得注意的是,vector具有内存自动管理的功能,对于元素的插入和删除,可以动态调整所占的内存空间. 容器vector的下标是从0开始的,如果vector容器的大小是n,则元素下标为0~n-1,这和数组的一样的.不一样的是,vector可以随时调整其大小. vector重要的方法有三个

C++ Primer(第五版)学习笔记_4_标准模板库string(1)

C++ Primer(第五版)学习笔记_4_标准模板库string(1) 1.创建string对象 创建一个空字符串,其长度为0 #include <iostream> #include <string> using namespace std; int main(int argc, char* argv[]) { string s; cout << s.length() << endl; return 0; } 运行结果: 0 2.给string对象赋值

C++ Primer(第五版)学习笔记_6_标准模板库_set集合容器

C++ Primer(第五版)学习笔记_6_标准模板库_set集合容器 Set集合容器实现了红黑树(Red-BlackTree)的平衡二叉检索树的数据结构,在插入元素时,它会自动调整二叉树的排序,把该元素放到适当的位置. (1)确保每个子树根节点的键值大于左子树所有节点的键值,而小于右子树所有节点的键值: (2)另外,还得确保根节点左子树的高度与右子树的高度相等.这样,二叉树的高度最小,从而检索速度最快. 平衡二叉检索树的检索使用中序遍历算法,检索效率高.默认情况下,将键值由小到大遍历. 对于s

C++ Primer(第五版)学习笔记_8_标准模板库_map映照容器

C++ Primer(第五版)学习笔记_8_标准模板库_map映照容器 map映照容器的元素数据是由一个键值和一个映照数据组成的,键值与映照数据之间具有一一映照的关系. map映照容器的数据结构也是采用红黑树来实现的. 1.map创建.元素插入和遍历访问 #include <iostream> #include <stdio.h> #include <vector> #include <map> #include <string> using n

C++ Primer 学习笔记_14_标准模板库_bitset位集合容器

C++ Primer 学习笔记_14_标准模板库_bitset位集合容器 bitset容器是一个bit位元素的序列容器,每个元素只占一个bit位,取值为0或1,因而很节省内存空间.下图是一个bitset的存储示意图,它的10个元素只使用了两个字节的空间. 使用bitset需要声明头文件"#include <bitset>" 1.创建bitset对象 创建bitset对象时,必须要指定容器的大小.bitset对象的大小一经定义,就不能修改了.下面这条语句就定义了bitset对