2012-05-31 177 views
1

我有一個指向對象的指針的容器。指針是一個基類,並且該層次結構實現了一個虛函數count()。我想在容器中計算總計count()如何用std算法重新實現?

我目前做這與for_each和lambda函數:

size_t sum = 0; 
std::for_each(ptrs_.begin(), ptrs_.end(), [&sum](ptr const *p) { 
    expr += p->count(); 
}); 
return sum; 

誰能幫我boost::bindstd::accumulate或其他性病的算法重新實現這一點?

+0

爲什麼'boost :: bind'?這種方法有什麼問題? – kennytm

回答

3
auto getcount = std::mem_fun(&Base::count); // nothing to bind, we just need a functor 

size_t sum = std::accumulate(
    boost::make_transform_iterator(ptrs_.begin(), getcount), 
    boost::make_transform_iterator(ptrs_.end(), getcount), 
    (size_t)0 
); 

如果你不喜歡auto,或者更可能的,如果你的編譯器沒有,那麼你當然可以粘貼的東西兩次,或去尋找的mem_fun返回類型,或使用捕捉到它函數模板:

template <typename IT, typename FUNC, typename T> 
T transform_accumulate(IT first, IT last, T init, FUNC func) { 
    return std::accumulate(
     boost::make_transform_iterator(first, func), 
     boost::make_transform_iterator(last, func), 
     init 
    ); 
} 

然後稱其爲:

transform_accumulate(ptrs_.begin(), ptrs_.end(), size_t(), std::mem_fun(&Base::count)); 

或者,使用的std::accumulate,需要一個二元仿函數形式:

struct AddCount { 
    size_t operator()(size_t result, Base *p) const { 
     return result + p->count(); 
    } 
}; 

size_t sum = std::accumulate(ptrs_.begin(), ptrs_.end(), size_t(), AddCount()); 

而不是寫AddCount,你當然可以使用lambda表達式。我希望你也可以使用<functional>中的東西構建它,但我不打算。

我還沒有測試過任何這個代碼,所以讓錯誤發現開始吧!