1

したがって、基本的には、データを集計するアルゴリズムを考え出そうとしています (つまり、ファイルから同じ名前のアイテムを結合します。ファイルには果物の名前とその横に果物の数量が含まれているため、数量も結合する必要があります)。

だから私はファイルから配列にすべての情報を保存しました.私はそれを感謝しますか?

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;
}
4

2 に答える 2

3

更新さて、ここでの私の最初の答え(以下を参照)はやや冗談でした。

したがって、 、 、および のみを使用した簡単なアプローチは次のvectorとおりiostreamですfind_if

IdeOneでライブを見る

#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";
}

古い答え:

前回の質問がタグに投稿されてから途方もなく長い時間が経過しているため、この機会にこの回答をやり過ぎないようにしてください

#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 
于 2013-09-24T11:28:06.733 に答える