码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-07-16 11:50:50      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:c++   stl   c++ primer   标准模板库   

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

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

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

标签:c++   stl   c++ primer   标准模板库   

原文地址:http://blog.csdn.net/keyyuanxin/article/details/46908267

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!