multimap的使用 in C++,同一个关键码存在多个值
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <map>
#include <fstream>
#include <sstream>
void ReadDataFromFile(std::string &filename, std::vector<std::vector<std::string> > &lines_feat) {
std::ifstream vm_info(filename.c_str());
std::string lines, var;
std::vector<std::string> row;
lines_feat.clear();
while(!vm_info.eof()) {
getline(vm_info, lines);
if(lines.empty())
break;
std::stringstream stringin(lines);
row.clear();
while(stringin >> var) {
row.push_back(var);
}
lines_feat.push_back(row);
}
}
template <class T>
void Display2DVector(std::vector<std::vector<T> > &vv) {
/*field0 field1 field2...*/
for(size_t i=;i<vv.size();++i) {
for(typename::std::vector<T>::const_iterator it=vv.at(i).begin(); it!=vv.at(i).end(); ++it) {
std::cout<<*it<<" ";
}
std::cout<<"\n";
}
std::cout<<"--------the total rows of the raw data is: "<<vv.size()<<" rows.\n";
}
template <class T>
void DisplayMapData(std::map<std::string, std::vector<T> > &mymap) {
/*the format of map_data is (key, vector), in which value is a vector of optional info*/
for(typename::std::map<std::string, std::vector<T> >::const_iterator it=mymap.begin(); it!=mymap.end(); ++it) {
std::cout<<it->first<<", ";
typename::std::vector<T>::const_iterator sit;
for(sit=it->second.begin(); sit!=it->second.end(); ++sit) {
std::cout<<*sit<<" ";
}
std::cout<<"\n";
}
std::cout<<"--------the total records of the Map is: "<<mymap.size()<<"\n";
}
template <class T>
void Vectors2Multimap(std::vector<std::vector<T> > &vv, std::multimap<std::string, std::vector<T> > &mymap) {
/*-----convert the 2d vector(the original data) to multimap(ip, <vector>)-------*/
for(size_t i=; i<vv.size(); ++i) {
size_t field=;
std::vector<std::string> vm_s;
vm_s.clear();
for(typename::std::vector<T>::const_iterator it=vv.at(i).begin();it!=vv.at(i).end();++it) {
size_t len=vv.at(i).size();
if(len == ) {
vm_s.push_back("value is none");
}
else if(len > && field) {
vm_s.push_back(*it);
field++;
}
else {
field++;
}
}
mymap.insert(make_pair(vv.at(i).front(), vm_s));
}
}
template <class T>
void ProcessFun(std::vector<std::vector<T> > &vv, std::map<std::string, std::vector<T> > &mymap) {
typedef typename::std::multimap<std::string, std::vector<T> >::const_iterator I;
std::multimap<std::string, std::vector<T> > mulmap;
Vectors2Multimap(vv, mulmap);
std::ofstream outfile;
outfile.open("out.csv", std::ios::out);
for(typename::std::map<std::string, std::vector<T> >::const_iterator it=mymap.begin(); it!=mymap.end(); ++it) {
std::string ip=it->first;
std::cout<<ip<<"*********************************************************\n";
std::pair<I, I> Info=mulmap.equal_range(ip);
typename::std::vector<T>::const_iterator sit;
if(Info.second==Info.first) {
for(sit=it->second.begin(); sit!=it->second.end(); ++sit) {
std::cout<<ip<<", "<<*sit<<", 未反馈"<<std::endl;
outfile<<ip<<", "<<*sit<<", 未反馈"<<std::endl;
}
}
else {
std::vector<std::string> v_ac;
v_ac.clear();
for(I i=Info.first; i!=Info.second; ++i) {
v_ac.push_back(i->second.front());
}
for(sit=it->second.begin(); sit!=it->second.end(); ++sit) {
typename::std::vector<T>::const_iterator find_it;
find_it=std::find(v_ac.begin(), v_ac.end(), *sit);
if(find_it == v_ac.end()) {
std::cout<<ip<<", "<<*sit<<", 未反馈"<<std::endl;
outfile<<ip<<", "<<*sit<<", 未反馈"<<std::endl;
}
else {
std::cout<<ip<<", "<<*sit<<", 反馈"<<", 已授权";
outfile<<ip<<", "<<*sit<<", 反馈"<<", 已授权";
for(I i=Info.first; i!=Info.second; ++i) {
std::string a_ip=i->first, ac=i->second.front();
if(a_ip == ip && ac == *sit && i->second.size() > ) {
std::cout<<", "<<i->second.at()<<", ";
outfile<<", "<<i->second.at()<<", ";
std::cout<<i->second.back()<<"\n";
outfile<<i->second.back()<<"\n";
}
if(a_ip == ip && ac == *sit && i->second.size() == ) {
std::cout<<std::endl;
outfile<<std::endl;
}
}
}
}
}
}
outfile.close();
}
template <class T>
void Vectors2Map(std::vector<std::vector<T> > &vv, std::map<std::string, std::vector<T> > &mymap) {
/*-----convert the 2d vector(the original data) to map(key, value) (ip, <vector>)-------*/
for(size_t i=; i<vv.size(); ++i) {
size_t field=;
std::vector<std::string> vm_s;
vm_s.clear();
for(typename::std::vector<T>::const_iterator it=vv.at(i).begin();it!=vv.at(i).end();++it) {
size_t len=vv.at(i).size();
if(len == ) {
vm_s.push_back("value is none");
}
else if(len > && field) {
vm_s.push_back(*it);
field++;
}
else {
field++;
}
}
mymap.insert(make_pair(vv.at(i).front(), vm_s));
}
}
int main() {
std::map<std::string, std::vector<std::string> > my_mapa, my_mapb;;
std::vector<std::vector<std::string> > lines_feata, lines_featb;;
std::string filename_a="serverAC.txt", filename_b="boss4a.txt";
/*read data from file to 2d vector*/
ReadDataFromFile(filename_a, lines_feata);
ReadDataFromFile(filename_b, lines_featb);
/*display the raw data*/
//Display2DVector(lines_feata);
//Display2DVector(lines_featb);
/*convert the 2d vectors to map*/
Vectors2Map(lines_feata, my_mapa);
//DisplayMapData(my_mapa); ProcessFun(lines_featb, my_mapa);
return ;
}
multimap的使用 in C++,同一个关键码存在多个值的更多相关文章
- [jQuery] jQuery如何获取同一个类标签的所有的值
碰巧在开发的时候遇到这个问题,因为jQuery总是只返回第一个类标签的值,所以无法达到我们的要求. 比如: var btn = jQuery('.btn').val(); 获取的只是第一个类标签为bt ...
- Bjarne Stroustrup对C++程序员的忠告
转自:http://blog.csdn.net/adm_qxx/archive/2007/05/20/1617488.aspx 第1章 致读者 [1] 在编写程序时,你是在为你针对某个问题的解决方 ...
- 【STL学习】map&set
技术不只是我的工作,也是我的生活,以后的博客中会穿插一些个人的喜悦.愤怒或者感悟,希望大家能够接受. 我所有的一切,比我技术更好的怕是我的脸皮了,昨天收到京东面试没有通过的消息,喊了几句“我好悲伤啊” ...
- STL编程:C++的忠告!
Copy别人的,有少量修改,可以做为一下参考! C++之父Bjarne Stroustrup 写的 The C++ Programming Language (Special Edition) 中各章 ...
- 深入了解STL中set与hash_set,hash表基础
一,set和hash_set简介 在STL中,set是以红黑树(RB-Tree)作为底层数据结构的,hash_set是以哈希表(Hash table)作为底层数据结构的.set可以在时间复杂度为O(l ...
- 词典(一) 跳转表(Skip table)
词典,顾名思义,就是通过关键码来查询的结构.二叉搜索树也可以作为词典,不过各种BST,如AVL树.B-树.红黑树.伸展树,结构和操作比较复杂,而且理论上插入和删除都需要O(logn)的复杂度. 在词典 ...
- java 超详细面经整理(持续更新)2019.12.19
目录 Java SE 请你解释HashMap中为什么重写equals还要重写hashcode? 请你介绍一下map的分类和常见的情况 请你讲讲Java里面的final关键字是怎么用的? 请你谈谈关于S ...
- 算法-基数排序(radix sort)
本文由@呆代待殆原创,转载请注明出处. 简介:这个排序是原来用在卡片排序机上的一个算法,一般用来比较具有多对关键字域的记录,如日期(年月日),通过基数排序我们会依次对年月日这三个关键字进行排序,只要对 ...
- 2021.12.06 平衡树——Treap
2021.12.06 平衡树--Treap https://www.luogu.com.cn/blog/HOJQVFNA/qian-xi-treap-ping-heng-shu 1.二叉搜索树 1.1 ...
随机推荐
- SQLServer bigint 转 int带符号转换函数(原创)
有一个需求是要在一个云监控的状态值中存储多个状态(包括可同时存在的各种异常.警告状态)使用了位运算机制在一个int型中存储. 现在监控日志数据量非常大(亿级别)需要对数据按每小时.每天进行聚合,供在线 ...
- C# 处理URL地址
calendarset.do?start=1548518400&end=1552147200&_=1546421856958calendarset.do?start=155093760 ...
- Redis 之服务器集群配置
常见的集群架构如图: redis操作过程中数据同步的函数调用关系: 集群搭建: 1.修改3个redis.config 文件的: 2.启动2个redis服务器 当杀掉redis主进程Master时,由于 ...
- 如何让 HTML 识别 string 里的 '\n' 并成功换行
只要在结果所在的 div 的 css 设置: white-space: pre-line; 然后页面就能成功识别 '\n' 并整齐的显示结果了.
- 新建python的虚拟环境
1.mkvirutalenv --python=E:\Users\00\AppData\Local\Programs\Python\Python37-32\python.exe article_spi ...
- C 利用strtok, feof 截取字符串
#cat /tmp/fff 10:hugetlb:/hello/06b11c9967cc0e106f5f4673246f671aa7388f623f58b250d9d9cb0f8c0f2b18 9:d ...
- c++ map: 使用struct或者数组做value
Notice 如果是program中有两个map对象,可能你需要两个map iterator,但是注意两个iter object不能命名一样,可以分别为iter1, iter2 Example #in ...
- The JVM Architecture Explained
转自:https://dzone.com/articles/jvm-architecture-explained?oid=18544920 Every Java developer knows tha ...
- [luogu4728 HNOI2009] 双递增序列 (dp)
传送门 Solution 前几天刚做了类似题,这种将一个序列拆分为两个单调序列的题一般都是设\(dp[i]\)表示i为一个单调序列的末尾时,另一个序列的末尾是多少 然后应用贪心的思想,在这道题中就是让 ...
- Spring MVC 笔记 概述
学习笔记 模型:封装装程序数据 视图:渲染模型数据,一般来说就是输出HTML 控制:处理请求,构建模型并将其传递给视图进行渲染 以上三者均围绕DispatcherServlet设计,它处理所有的HTT ...