C++在Vector中分组重复

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)

什么是一种优雅的方式来解决这个问题?

谢谢

And*_*ing 1

以下代码使用了std::unordered_map注释所建议的 an 。它会逐行读取您的文件。
该代码假设人员的 id 类型为int,代码类型为std::string,数据类型为int

它将每个Person(这里作为示例结构)插入到映射中。如果一个人的 ID 已经存在,它将汇总数据。这意味着该解决方案不使用临时文件std::vector,而仅使用std::unordered_map.

在 ideone.com 上查看包含您的数据的实时示例

代码:

#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)

输出:

235334 : 0
123456 : 7
Run Code Online (Sandbox Code Playgroud)