Cou*_*ite 6 c++ grouping vector repeat
我有一个像这样结构的文件:
A 123456 0
G 123456 5
A 235334 0
B 123456 2
Run Code Online (Sandbox Code Playgroud)
每条信息都存储如下:
temp.code >> temp.personid >> temp.data
Run Code Online (Sandbox Code Playgroud)
我已将此信息存储在Vector中
ifstream fin("test.txt");
vector<TestClass> test;
TestClass temp;
string line;
while (getline(fin, line)) {//.. test.push_back(temp);}
Run Code Online (Sandbox Code Playgroud)
给定的personid可以在文件中多次出现.我想要做的是迭代向量并将重复组合成每个personid的单个类对象,我的目标是我想要为每个特定对象求和,以便上面文件的输出为:
123456 : 7
235334 : 0
Run Code Online (Sandbox Code Playgroud)
什么是一种优雅的方式来解决这个问题?
谢谢
以下代码使用了std::unordered_map注释所建议的 an 。它会逐行读取您的文件。
该代码假设人员的 id 类型为int,代码类型为std::string,数据类型为int。
它将每个Person(这里作为示例结构)插入到映射中。如果一个人的 ID 已经存在,它将汇总数据。这意味着该解决方案不使用临时文件std::vector,而仅使用std::unordered_map.
代码:
#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
#include <unordered_map>
struct Person
{
std::string code;
int data;
};
typedef std::unordered_map<int, Person> PersonMap;
int main()
{
std::ifstream fin("test.txt");
PersonMap persons;
/* line by line reading */
for (std::string line; std::getline(fin, line); )
{
std::istringstream iss(line);
int personId;
Person personData;
/* parse line as std::string, int, int */
iss >> personData.code >> personId >> personData.data;
/* insert into map and save result */
std::pair<PersonMap::iterator, bool> insertResult =
persons.insert(std::pair<int, Person>(personId, personData));
/* if personId is already there */
if (!insertResult.second)
{
insertResult.first->second.data += personData.data;
}
}
/* output whole map */
for(auto const &person : persons)
{
std::cout << person.first << " : " << person.second.data << "\n";
}
std::cout << std::flush;
}
Run Code Online (Sandbox Code Playgroud)
输出:
Run Code Online (Sandbox Code Playgroud)235334 : 0 123456 : 7