#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++,同一个关键码存在多个值的更多相关文章

  1. [jQuery] jQuery如何获取同一个类标签的所有的值

    碰巧在开发的时候遇到这个问题,因为jQuery总是只返回第一个类标签的值,所以无法达到我们的要求. 比如: var btn = jQuery('.btn').val(); 获取的只是第一个类标签为bt ...

  2. Bjarne Stroustrup对C++程序员的忠告

    转自:http://blog.csdn.net/adm_qxx/archive/2007/05/20/1617488.aspx  第1章 致读者  [1] 在编写程序时,你是在为你针对某个问题的解决方 ...

  3. 【STL学习】map&set

    技术不只是我的工作,也是我的生活,以后的博客中会穿插一些个人的喜悦.愤怒或者感悟,希望大家能够接受. 我所有的一切,比我技术更好的怕是我的脸皮了,昨天收到京东面试没有通过的消息,喊了几句“我好悲伤啊” ...

  4. STL编程:C++的忠告!

    Copy别人的,有少量修改,可以做为一下参考! C++之父Bjarne Stroustrup 写的 The C++ Programming Language (Special Edition) 中各章 ...

  5. 深入了解STL中set与hash_set,hash表基础

    一,set和hash_set简介 在STL中,set是以红黑树(RB-Tree)作为底层数据结构的,hash_set是以哈希表(Hash table)作为底层数据结构的.set可以在时间复杂度为O(l ...

  6. 词典(一) 跳转表(Skip table)

    词典,顾名思义,就是通过关键码来查询的结构.二叉搜索树也可以作为词典,不过各种BST,如AVL树.B-树.红黑树.伸展树,结构和操作比较复杂,而且理论上插入和删除都需要O(logn)的复杂度. 在词典 ...

  7. java 超详细面经整理(持续更新)2019.12.19

    目录 Java SE 请你解释HashMap中为什么重写equals还要重写hashcode? 请你介绍一下map的分类和常见的情况 请你讲讲Java里面的final关键字是怎么用的? 请你谈谈关于S ...

  8. 算法-基数排序(radix sort)

    本文由@呆代待殆原创,转载请注明出处. 简介:这个排序是原来用在卡片排序机上的一个算法,一般用来比较具有多对关键字域的记录,如日期(年月日),通过基数排序我们会依次对年月日这三个关键字进行排序,只要对 ...

  9. 2021.12.06 平衡树——Treap

    2021.12.06 平衡树--Treap https://www.luogu.com.cn/blog/HOJQVFNA/qian-xi-treap-ping-heng-shu 1.二叉搜索树 1.1 ...

随机推荐

  1. jQuery——类的添加与删除

    添加类:addClass 删除类:removeClass 判断类是否存在:hasClass <!DOCTYPE html> <html lang="en"> ...

  2. [Windows Server 2012] 服务器安全加固

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:服务器安全加固 ...

  3. mysql常用命令介绍

    mysql适用于在Internet上存取数据,支持多种平台 1.主键:唯一标识表中每行的这个列,没有主键更新或删除表中的特定行很困难. 2.连接mysql可以用Navicat 要读取数据库中的内容先要 ...

  4. SQL server 2005中无法新建作用(Job)的问题

    1.在使用sqlserver2005创建作业时,创建不了,提示 无法将类型为“Microsoft.SqlServer.Management.Smo.SimpleObjectKey”的对象强制转换为类型 ...

  5. (原创)如何对APP服务端进行压力测试

    版权声明:本文为原创文章,转载请先联系并标明出处 APP性能测试分为客户端性能测试和服务端性能测试,客户端的性能测试主要是针对启动快慢.耗电量.耗流量.内存使用等指标进行评估,目前主流的APP客户端性 ...

  6. Python 之数据类型

    # Numbers(数字) # int(有符号整型) # long(长整型[也可以代表八进制和十六进制]) # float(浮点型) # complex(复数) # String(字符串) # Lis ...

  7. 怎么选择最适合自己的Python培训机构?

    Python培训已经成为入门Python的一个重要途径,它的优势在于学习知识的系统性.快速性和实用性.Python培训毕业的学员大多数拥有较强的实战动手能力,能够较快上手,更符合企业需求. 不过,大部 ...

  8. leetcode刷题记录--js

    leetcode刷题记录 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但 ...

  9. MySQL的分组和排序

    分组操作 select count(id) from userinfo group by pat(id); -- 聚合函数: --count --max --sum --avg ---如果对于二次函数 ...

  10. 取代PHP原生函数的一些扩展包

    前言 虽然程序员无时无刻都在造轮子,但造轮子也有效率之分,用好轮子才能造出好"