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 ...
随机推荐
- C#——简单工厂
简单工厂的方法实现过程核心就是之前介绍的接口应用.所以直接上代码: public interface IPerson { void Say(); } public class Student : IP ...
- Java中的接口详解
接口 是Java语言中一种引用类型,是方法的集合,如果说类的内部封装了成员变量.构造方法和成员方法,那么接口的内部主要就是封装了方法,包含抽象方法(JDK 7及以前),默认方法和静态方法(JDK 8) ...
- CAD从二制流数据中加载图形(com接口VB语言)
主要用到函数说明: _DMxDrawX::ReadBinStream 从二制流数据中加载图形,详细说明如下: 参数 说明 VARIANT varBinArray 二制流数据,是个byte数组 BSTR ...
- redis --------- 使用命令(每天一个)
Key(键) Del 语法:DEL Key [key ...] 删除给定的一个或者多个key 不存在的key会被忽略. 返回值: 被删粗key的数量# 删除单个 key redis ...
- vivado2018.3 与 modelsim联合仿真
我用的是目前最新版本的软件,vivado2018.3与modelsim10.6d.废话不多说,直接上操作 1.modelsim编译vivado库 1)双击启动vivado软件,如下图操作 2)Simu ...
- PAT_A1114#Family Property
Source: PAT A1114 Family Property (25 分) Description: This time, you are supposed to help us collect ...
- uva 1583 Digit Generator(Uva-1583)
题目不再写入了,vj:https://vjudge.net/problem/UVA-1583#author=0 主要讲的是找一个数的小于它的一个数,小于它的那个数每一位加起来再加上那个数就会等于原来的 ...
- 00107_TCP通信
1.TCP通信的概述 (1)TCP通信同UDP通信一样,都能实现两台计算机之间的通信,通信的两端都需要创建socket对象: (2)区别在于: ①UDP中只有发送端和接收端,不区分客户端与服务器端,计 ...
- 公钥基本结构(PKI)的概念
公钥证书 ,通常简称为证书 ,用于在 Internet.Extranet 和 Intranet 上进行身份验证并确保数据交换的安全.证书的颁发者和签署者就是众所周知的 证书颁发机构 (CA),将在下一 ...
- 【Codeforces 158C】Cd and pwd commands
[链接] 我是链接,点我呀:) [题意] 让你实现Shell的cd和pwd操作 [题解] 用一个list表示当前的路径 如果路径以/开头则表示需要清空当前路径重新走路 否则在原来路径的基础上继续加就可 ...