C++multimap的使用

问题描述
假如最终需要这种数据结构:
从一个文件中我们可以读出每个h和w,现在需要获取每个h对应的所有w,形如这样的结构,h1w1/w2 h2w2/w3。
思路
首先需要读出文件所有的h和w,那么可以使用map去存,但是一个h可能对应着这多个w,所以需要可以存储重复键值的map,即multimap。然后对每组multimap中的元素遍历,最终的键是不能重复的,所有每处理一组的key,都要放在set中,然后每组value也是不能重复的,去过不进行处理,会出现重复读,即h1*w1/w2/w2/w1,多以还需要对value进行set处理。实现的代码如下:

#include<head.h>
#include<unordered_map>
#include<unordered_set>
#include<cstdlib>
//#include<stdlib.h>        //C++风格引入的头文件一般前面以'c'开头,而C风格是'.h'
#include<ctime>
#include<math.h>
#include<memory>            //定义了智能指针、allocator
#include<new>               //定义了bad_alloc和nothro
#include<complex>           //构造函数初始化语法,不引入好像也么有什么关系
#include<conio.h>           //_getch函数需要的头文件
#include<functional>
#include"Stack.h"
int main()
{
    multimap<string,string> _multimap;
    _multimap.insert(multimap<string,string>::value_type("h1","w1"));
    _multimap.insert(multimap<string,string>::value_type("h2","w3"));
    _multimap.insert(multimap<string,string>::value_type("h2","w3"));
    _multimap.insert(multimap<string,string>::value_type("h2","w1"));
    _multimap.insert(multimap<string,string>::value_type("h2","w2"));
    _multimap.insert(multimap<string,string>::value_type("h2","w3"));
    _multimap.insert(multimap<string,string>::value_type("h2","w3"));
    _multimap.insert(multimap<string,string>::value_type("h3","w1"));
    _multimap.insert(multimap<string,string>::value_type("h3","w1"));
    /**
     *   根据key值输出multimap中的所有键值,
     *  如果根据find和count函数去输出所有的信息,那么会存在一个问题,当一个键出现
     *  第二次的时候,就不可避免的又把该键的所有值输出,最终总的次数为键*键,所有不能
     *  有重复的键,通过set去重,然后遍历set,从set中取元素作为find和count的关键字去
     *  输出该键对应的所有值。
     *     第一步:遍历multimap,取其关键字插入到set中
     *     第二步:遍历set,取元素作为find和count的参数
     *     最后一步:在for循环中输出multimap的所有键值
     */ 
    multimap<string,string>::iterator iter2 = _multimap.begin();
    set<string> _set;
    while(iter2 != _multimap.end())
    {
        string muti_key = iter2->first;
        _set.insert(muti_key);
        cout << iter2->first << "," << iter2->second << endl;
        iter2++;
    }
    cout << "set中的数据" << endl;
    set<string,string>::iterator iter3 = _set.begin();          //保存不重复的multimap键
    multimap<string,string>::iterator iter4;                    //保证不会取到重复的键的multimap
    while(iter3 != _set.end())
    {
        cout << *iter3 << endl;
        int count = _multimap.count(*iter3);                //当前key对应的value个数,value的个数有重复的,应该在下面去掉
        iter4 = _multimap.find(*iter3);

        //拼接部分。显示最终的结果
        string temp;
        temp = iter4->first + "*";
        set<string> _temp_set;          //去掉重复的值

        for(size_t ix=0; ix<count; ++ix)
        {
            _temp_set.insert(iter4->second);
            iter4++;                    //iter4在这里已经走到最后一个元素的末尾了
        }

        set<string>::iterator _temp_set_iter = _temp_set.begin();   //迭代器必须在存储数据之后,在输出的时候才能定义???
        while (_temp_set_iter != _temp_set.end())
        {
            temp += *_temp_set_iter + "/";
            _temp_set_iter++;
        }

        /* for(size_t ix=0; ix<count; ++ix)
        {
            temp += iter4->second + "/";
            cout << "key=" << iter4->first << ",value=" << iter4->second << endl;
            iter4++;                    //iter4在这里已经走到最后一个元素的末尾了
        } */
        cout << "temp=" << temp << endl;


        cout << "===============================================" << endl;
        

        iter3++;
    }
   

    return 0;
}

运行结果为:
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值