2013-02-19 55 views
1

我是新來的函子主題,所以我希望這個問題將是建設性的。函子和字符串向量

我有數組的字符串()。我需要在函子的幫助下計算這些字符串長度的總和。

我的代碼:

class LengthFinder{ 
    private: 
     size_t sum; 
    public: 
     LengthFinder():sum(0){} 

    void operator()(string elem) 
    { 
     sum += elem.size(); 
    } 
    operator int() 
    { 
     return sum; 
    } 

}; 

int main(int argc, char* argv[]) 
{ 
    vector<string> array; 
    array.push_back("string"); 
    array.push_back("string1"); 
    array.push_back("string11"); 

    string elem; 
    int sum = std::for_each(array.begin(), array.end(), LengthFinder(/*??*/)); 
    return 0; 
} 

我應該通過什麼LengthFinder(),讓每個字符串,並把它的大小?

+0

你試過運行你的代碼?您想在長度定位器中放什麼? – billz 2013-02-19 06:23:10

+1

你不需要做任何事情。只有'LengthFinder()'創建一個臨時實例用於'for_each',並且'for_each'在該實例中調用'operator()'方法。 – 2013-02-19 06:24:26

+0

但是,您可能希望將'operator()'的參數改爲一個常量引用,即'void operator()(const std :: string&elem)'。 – 2013-02-19 06:25:08

回答

5

請勿爲此使用for_each。它可以被迫做這項工作,但這是相當多的額外工作,因爲它不是真正適合工作的工具。

你想要使用的是std::accumulate,它是爲你正在做的事情而準備的。

struct length : std::binary_function<size_t, size_t, std::string> { 
    size_t operator()(size_t a, std::string const &b) { 
     return a+b.length(); 
    } 
}; 

// ... 
int sum = std::accumulate(array.begin(), array.end(), 0, length()); 
+0

謝謝!我已根據@Joachim Pileborg的建議更正了我的代碼,現在它正在工作。你的建議正是我想要的,所以我會用它! – 2013-02-19 06:36:08

0

如前所述對這個問題的樓主:


SOLUTION:

沒有什麼應該去LengthFinder的參數:

int sum = std::for_each(array.begin(), array.end(), LengthFinder());