2009-12-31 94 views
20

我一直在讀Accelerated C++,我不得不說這是一個有趣的書。結合字符串矢量

在第6章中,我必須使用一個函數從<算法>從矢量<串>來連接成一個單一的字符串。我可以使用累加,但它沒有幫助,因爲字符串容器只能push_back字符。

int main() { 
    using namespace std; 
    string str = "Hello, world!"; 
    vector<string> vec (10, str); 
    // Concatenate here? 

    return 0; 
} 

如何將字符串連接在一起?

+0

你在問什麼? – tster 2009-12-31 16:19:37

回答

48

假設這是問題6.8,它沒有說你必須使用積累 - 它說使用「​​庫算法」。但是,您可以使用累積:

#include <numeric> 

int main() { 
    string str = "Hello World!"; 
    vector<string> vec(10,str); 
    string a = accumulate(vec.begin(), vec.end(), string("")); 
    cout << a << endl; 
} 

所有這一切積累不設置「和」的第三個參數,然後對所有從第一個參數第二個參數的值「VAL」的,這樣做:

sum = sum + val 

它,然後返回 '總和'。儘管積累是在<numeric>宣佈的事實,它將適用於任何實施operator+()

+0

謝謝,我試着用第三個參數積累,作爲a.begin,沒有工作,我也試圖用back_inserter失敗了。你能解釋這是如何工作的嗎?非常感謝。 – Bogdan 2009-12-31 16:40:13

+1

它將.begin()中的每個元素都帶到.end()中,並將它們累加到第三個參數中,這是一個作爲臨時傳入的空std :: string。 std :: acumulate()的返回值是積累的結果,按值傳遞。 – 2009-12-31 17:44:51

+3

順便說一下,這種方法可能非常嚴重,因爲可能涉及大量的複製/實例。 – sellibitze 2010-09-13 18:19:39

6

我不知道你question.Where這就是問題所在?它只是一個循環的問題。

#include<vector> 
#include<string> 
#include<iostream> 

int main() 
{ 
    std::string str = "Hello World!"; 
    std::vector<string> vec (10,str); 

    for(size_t i=0;i!=vec.size();++i) 
     str=str+vec[i]; 
    std::cout<<str; 
} 

編輯:

使用for_each()<algorithm>

試試這個:

#include<vector> 
#include<string> 
#include<iostream> 
#include<algorithm> 
using namespace std; 
string i; 
void func(string &k) 
{ 
    i+=k; 
} 
int main() { 
    string str = "Hello World!"; 
    vector<string> vec (10,str); 

    for_each(vec.begin(),vec.end(),func); 
    cout<<i; 
    return 0; 
    } 
+1

我必須使用算法標題中的函數才能做到這一點。 – Bogdan 2009-12-31 16:23:23

+0

這不是很好,但我想它的工作原理,ty – Bogdan 2009-12-31 16:33:17

+0

這個問題本身並不好。 xD – 2009-12-31 16:34:43

12

std :: copy?

std::ostringstream os; 
std::copy(vec_strings.begin(), vec_string.end(), ostream_iterator<string>(os)); 
cout << os.str() << endl; 
6

下面的代碼片斷編譯在Visual C++ 2012,並使用lambda函數:

int main() { 
    string str = "Hello World!"; 
    vector<string> vec (10,str); 

    stringstream ss; 
    for_each(vec.begin(), vec.end(), [&ss] (const string& s) { cat(ss, s); }); 
    string a = ss.str(); 

    cout << a << endl; 
} 

在第一答案的accumulate例子是優雅,但作爲sellibitze指出的那樣,它與每個級聯重新分配和在O(N 2)處縮放。這個for_each片段在約O(N)處縮放。我使用100K字符串分析了兩種解決方案; accumulate示例花了23.6秒,但這個for_each片段花了0.054秒。

+1

創建一個'std :: sring'調用'reserve(final-size)'可能會更快,然後使用'+ =',這應該是快速的,因爲緩衝區已經是正確的大小了。 – 2016-07-12 22:03:08