2014-12-02 94 views
0

我是新的C++,我不知道有沒有辦法來連接從vector< string>串到使用copy()一個字符串。我知道我可以使用accumulate(),但我不知道什麼是錯的「引擎蓋下」使用此代碼:串聯字符串複製()

string concat_v (const vector<string>& v) { 
    string s; 
    copy(v.begin(), v.end(), back_inserter(s)); 
    return s; 
} 

或用:

s.insert(s.end(), v.begin(), v.end()); 

回答

3

與您的代碼樣本的問題是,你不能將string複製到預計需要char的內容。這是同樣的問題:

string s = "Hello"; 
char ch = s;   // ??? 

std::accumulate功能做你要求什麼,我不知道爲什麼你仍然想知道如果有一種方法:)使用它的方式是:

string s; 
s = std::accumulate(v.begin(), v.end(), s); 

這就要求operator+做積累。還有一個累積的版本,它會調用您提供的自定義函數。

+0

他可能不知道如何使用它(「運算符+」與二進制版本)。我必須去查看它。 (我從你這樣的人那裏學到很多整潔的東西)。 – jww 2014-12-02 23:16:28

+0

@jww添加示例 – 2014-12-02 23:27:32

0

如果你正在尋找一個班輪,我會使用accumulate。我認爲你提到的兩個人沒有辦法。

string concat_v (const vector<string>& v) { 
    string s; 
    s = accumulate(v.begin(), v.end(), string()); 
    return s; 
}  
+1

我不認爲這會按書面形式工作。 'std :: accumulate'使用第三個參數的類型作爲累加器,當作爲參數傳遞給函數模板時''「'的類型是'char const *'。我會做第三個參數'std :: string()'。 – 2014-12-03 00:02:29

1

如果你真的std::copy代替std::accumulate做的工作,你可以用一點中介這樣做,如std::stringstream

string concat_v (const vector<string>& v) { 
    stringstream s; 
    copy(v.begin(), v.end(), ostream_iterator<string>(s)); 
    return s.str(); 
} 

對於這個特定的目的,所有的輸入都是相同類型的,並且支持加法運算符(並且它是你想要的),accumulate似乎是明確的選擇。當/如果你想要一個連接字符串時,使用stringstream可能會更好,即使(例如)添加項目可能會產生完全不同的東西(例如,你想要一個包含{1,2,3}的int數組出現作爲1231 2 3,而不是6)。

0

與std :: accumulate一起在性能方面帶來顯着優勢。

在累加,我們有

while (first!=last) { 
    init = init + *first; 
    ++first; 
    } 

「初始化」是操作+調用的所得,並累積所串接字符串。這很好,因爲它不會爲每個中間結果分配臨時對象,也不會複製臨時對象。當然,對於字符串大小調整,您可能會生成副本 - 但這是另一回事。

性能差異不是微不足道的。