我一直在阅读Accelerated C++,我不得不说这是一本有趣的书。
在第6章中,我必须使用< algorithm>中的函数。从矢量< string>连接成一个字符串。我可以使用累积,但它没有帮助,因为字符串容器只能push_back字符。
int main () {
using namespace std;
string str = "Hello, world!";
vector<string> vec (10, str);
// Concatenate here?
return 0;
}
如何将字符串连接在一起?
答案 0 :(得分:52)
假设这是问题6.8,它并没有说你必须使用累积 - 它说使用“库算法”。但是,您可以使用accumulate:
#include <numeric>
int main () {
std::string str = "Hello World!";
std::vector<std::string> vec(10,str);
std::string a = std::accumulate(vec.begin(), vec.end(), std::string(""));
std::cout << a << std::endl;
}
累积所做的全部是将'sum'设置为第三个参数,然后对于从第一个参数到第二个参数的所有值'val',执行:
sum = sum + val
然后返回'sum'。尽管累积是在<numeric>
中声明的,但它将适用于任何实现operator+()
答案 1 :(得分:12)
std :: copy怎么样?
std::ostringstream os;
std::copy( vec_strings.begin(), vec_string.end(), ostream_iterator<string>( os ) );
cout << os.str() << endl;
答案 2 :(得分:7)
以下代码段在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); });
cout << ss.str() << endl;
}
第一个答案中的accumulate
示例很优雅,但正如sellibitze指出的那样,它会重新分配每个连接并在O(N²)处缩放。此for_each
代码段的大小约为O(N)。我用100K字符串描述了两种解决方案; accumulate
示例耗时23.6秒,但此for_each
代码段耗时0.054秒。
答案 3 :(得分:5)
我不确定你的问题。问题出在哪里?这只是一个循环问题。
#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;
}