所以基本上我正在尝试提出一种算法来加重数据(即从文件中合并同名的项目,文件中包含水果名称和水果数量,因此我必须将数量组合起来)。< / p>
所以我已经将文件中的所有信息存储到一个数组中,到目前为止这是我的算法:(问题是我知道这不会考虑具有两个以上相同水果名称的项目,任何人有什么建议我会很感激吗?
int aggregatedataA(items_t overallfruit[],items_t samefruit[], items_t uniquefruit[], int num){
int i, j, x=0, y=0;
for(i=0; i<num; i++){
for(j=0; j<num; j++){
if(overallfruit[i].name==overallfruit[j].name){
samefruit[x].name = overallfruit[i].name;
samefruit[x].quantity = overallfruit[i].quantity + overallfruit[j].quantity;
x++;
}
else{
uniquefruit[y].name = overallfruit[i].name;
uniquefruit[y].quantity = overallfruit[i].quantity;
y++;
}
}
}
return x;
}
答案 0 :(得分:3)
使用map<string, int>
存储所有水果及其数量。然后在这张地图中找到数量&gt; 1并将它们复制到,例如vector<string>
。然后对数量= 1的水果做同样的事情。例如:
#include<iostream>
#include<vector>
#include<map>
#include<string>
#include<algorithm>
#include<functional>
#include<iterator>
#include<boost/bind.hpp>
#include<boost/ref.hpp>
using namespace std;
void same( vector<string> &vec, pair<string, int> pairObject)
{
if( pairObject.second >1)
vec.push_back(pairObject.first);
}
void uni( vector<string> &vec, pair<string, int> pairObject)
{
if( pairObject.second == 1)
vec.push_back(pairObject.first);
}
int main()
{
string af[8] = {"apple", "grape", "strewberry", "bannana", "mango", "papaya", "apple", "bannana"};
vector<string> overallfruits(af,af+8);
vector<string> samefruits;
vector<string> uniquefruits;
map<string, int> mfruits;
for (int ix = 0; ix <overallfruits.size(); ++ix)
mfruits[overallfruits[ix]]++;
for_each(mfruits.begin(), mfruits.end(), boost::bind(same, boost::ref(samefruits), _1));
for_each(mfruits.begin(), mfruits.end(), boost::bind(uni, boost::ref(uniquefruits), _1));
cout << "all: "; copy(overallfruits.begin(), overallfruits.end(),ostream_iterator<string>(cout," "));cout << endl;
cout << "same: "; copy(samefruits.begin(), samefruits.end(),ostream_iterator<string>(cout," "));cout << endl;
cout << "unique: "; copy(uniquefruits.begin(), uniquefruits.end(),ostream_iterator<string>(cout," "));cout << endl;
}
答案 1 :(得分:3)
更新好的,我原来的答案(见下文)有点开玩笑。
所以,这是一个只有vector
,iostream
和find_if
的简单方法:
#include <string>
#include <iostream>
#include <algorithm>
#include <vector>
#include <sstream>
using namespace std;
struct entry {
string name;
unsigned quantity;
};
vector<entry> readData()
{
vector<entry> data;
string line, name;
unsigned quantity;
while (getline(cin, line) &&
istringstream(line) >> name >> quantity)
{
auto found = find_if(begin(data), end(data), [&](entry const& a) { return a.name == name; });
if (end(data) == found)
data.push_back({name, quantity});
else
found->quantity += quantity;
}
return data;
}
int main()
{
vector<entry> const data = readData();
for (auto it = data.begin(); it != data.end(); ++it)
cout << it->name << " " << it->quantity << "\n";
}
老答案:
因为自从上一个问题发布在boost-spirit标记以来已经过了很长时间,所以lemme只是借此机会过度杀死这个答案:
#include <boost/fusion/adapted/std_pair.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/karma.hpp>
#include <boost/spirit/include/phoenix.hpp>
namespace qi = boost::spirit::qi;
namespace karma = boost::spirit::karma;
namespace phx = boost::phoenix;
int main()
{
std::map<std::string, unsigned> data;
std::cin.unsetf(std::ios::skipws);
{
using namespace boost::spirit::qi;
phrase_parse(
boost::spirit::istream_iterator(std::cin), {},
(as_string[+alpha] >> uint_) [ phx::ref(data)[_1] += _2 ]
% eol,
blank);
}
std::cout << "Got #" << data.size() << " unique fruits\n";
{
using namespace boost::spirit::karma;
std::cout << format(delimit(' ') [auto_] % eol, data);
}
}
输入
apple 5
pear 2
grape 6
mangoes 3
apple 2
mangoes 9
打印
Got #4 unique fruits
apple 7
grape 6
mangoes 12
pear 2