Накопить результат от функции-члена элементов в контейнере - PullRequest
5 голосов
/ 07 декабря 2011

У меня есть класс с функцией, которая возвращает счет, например:

class CTestClass
{
public:
    // ...
    size_t GetCount()const;
    // ...
};

И где-то в моей программе у меня есть вектор объектов этого класса.У меня есть функция, чтобы получить общее количество (сумма результатов CTestClass :: GetCount ()), реализованный как обычный цикл:

size_t sum = 0;
for(vector<CTestClass>::const_iterator it = v.begin(); it != v.end(); ++it)
{
    sum += it->GetCount();
}

Я хочу реорганизовать его, чтобы использовать средства, доступные в стандартебиблиотека, и я подумал о accumulate.Я смог сделать это с помощью функционального объекта (легко), но я почти уверен, что это можно сделать без объявления другого объекта (у меня нет C ++ 11 или boost, поэтому нет лямбды, но яиметь TR1).
Когда я искал ответ, я нашел эти ресурсы, но они не решают вопрос:

  • Этот почти такой жевопрос, и предоставленные ответы - это цикл, накопление и функтор, и накопление, и лямбда, но есть неотвеченная ссылка на связывание и т. п.
  • Этот ответ на аналогичный вопрос использует accumulate, plus и bind, но использует элемент данных вместо функции-члена.

Итак, есть ли способ сделать это, используя связывание, или что-то подобное?

Ответы [ 2 ]

7 голосов
/ 07 декабря 2011

Я думаю, что должно работать следующее:

using namespace std;
using namespace std::tr1;
using namespace std::tr1::placeholders;

accumulate(v.begin(), v.end(), 0,
           bind(plus<size_t>(), _1, bind(&C::GetCount, _2))
);
2 голосов
/ 07 декабря 2011

Это тоже работает:

class CTestClass
{
public:
    // ...
    size_t GetCount()const;
private:
    operator size_t() { return GetCount(); }
    // ...
    template <typename InputIterator, typename T>
    friend T std::accumulate(InputIterator, InputIterator, T);

};


std::vector<CTestClass> v;
// fill vector

size_t result = std::accumulate(v.begin(), v.end(), 0);

Нет TR1, нет привязки:)

...