#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. [Windows Server 2012] MySQL安全加固

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

  2. hibernate注解之@Onetomany、@Manytoone、@JoinColumn

    @Onetomany用于实体类与数据库表映射中少的一方,请看下面的例子. 假设一个用户只有一种角色,用户和角色是onetomany的关系 用户实体 @Entity @Table(name=" ...

  3. 在对话框添加bitmap

    CBitmap bitmap; //加载指定位图资源 Bmp图片ID bitmap.LoadBitmap(IDB_BITMAP1); //获取对话框上的句柄 图片控件ID CStatic *p = ( ...

  4. CAD在网页中得到批注信息

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  5. LeetCode--不同路径

    一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ).机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为“Finish”).现在考虑网格中 ...

  6. redis在linux下安装以及扩展

    安装过redis后发现回头忘了,今天重新安装记录下 首先 我是在home下创建redis文件   mkdir  redis 然后直接用wget安装 wget http://download.redis ...

  7. 洛谷——P2504 [HAOI2006]聪明的猴子

    P2504 [HAOI2006]聪明的猴子 题目描述 在一个热带雨林中生存着一群猴子,它们以树上的果子为生.昨天下了一场大雨,现在雨过天晴,但整个雨林的地表还是被大水淹没着,部分植物的树冠露在水面上. ...

  8. django的时间问题

    三个时间datetime.datetime.now().datetime.datetime.utcnow()与django.util.timezone.now()的区别 datetime.dateti ...

  9. 第三节:numpy之数组数学运算

  10. 第一节:numpy之ndarray对象数据类型及属性