问题描述
假如最终需要这种数据结构:
从一个文件中我们可以读出每个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;
}
运行结果为: