2009-12-31 93 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