Поддержка операций на нескольких уровнях агрегации - PullRequest
0 голосов
/ 09 ноября 2010

Предположим, у меня есть структура или класс, который выглядит примерно так: <pre> struct foo{ string attribute_1; int attribute_2; string attribute_3;</p> <p>int value_1; int value_2; double value_3; };

Каковы хорошие способы поддержки агрегатных операций над коллекциями foo для разных атрибутов? Например. Я мог бы хотеть суммировать value_1, где attribute_1 это что-то или где атрибут 2 это что-то, а атрибут 3 что-то.

Я использовал boost :: multi_index для этого, но я хотел бы услышать, как другие люди делают это. Возможно, когда вам нужна такая возможность, лучше использовать ее для встраивания базы данных в память. Что другие люди сделали для этого?

1 Ответ

0 голосов
/ 09 ноября 2010

STL алгоритмы и функторы позволят вам делать подобные вещи разными способами.Например, чтобы суммировать value_1, где attribute_1 является чем-то, вы можете сделать что-то вроде ( ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Это не было рядом с компилятором )

class MyFunctor
{
public:
    explicit MyFunctor(const string &str) : str_(str), sum_(0) {}
    bool operator() (const foo &f) const
    {
        if (f.attribute_1 == str_)
        {
            sum_ += f.value_1;
        }
    }
    int sum() const { return sum_; }

private:
    string str_;
    int    sum_;
};

...


std::cout << stl::for_each(v.begin(), v.end(), MyFunctor("blah")).count() << std::endl;

, где v является, например,std::vector<foo>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...