Bog*_*dan 21 c++ string stl vector
我一直在阅读Accelerated C++,我不得不说这是一本有趣的书.
在第6章中,我必须使用<algorithm>中的函数将vector <string>连接成单个字符串.我可以使用累积,但它没有帮助,因为字符串容器只能push_back字符.
int main () {
using namespace std;
string str = "Hello, world!";
vector<string> vec (10, str);
// Concatenate here?
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如何将字符串连接在一起?
小智 53
假设这是问题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;
}
Run Code Online (Sandbox Code Playgroud)
积累的所有内容都是将'sum'设置为第三个参数,然后对于从第一个参数到第二个参数的所有值'val',执行:
sum = sum + val
Run Code Online (Sandbox Code Playgroud)
然后它返回'sum'.尽管累积声明在<numeric>其中,它将适用于任何实现的东西operator+()
San*_*a R 12
std :: copy怎么样?
std::ostringstream os;
std::copy( vec_strings.begin(), vec_string.end(), ostream_iterator<string>( os ) );
cout << os.str() << endl;
Run Code Online (Sandbox Code Playgroud)
下面的代码片段在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;
}
Run Code Online (Sandbox Code Playgroud)
第accumulate一个答案中的例子很优雅,但正如sellibitze指出的那样,它会重新分配每个连接并在O(N²)处进行缩放.这个for_each片段的大小约为O(N).我用100K字符串描述了两种解决方案; 这个accumulate例子耗时23.6秒,但这个for_each片段耗时0.054秒.
我不确定你的问题.问题出在哪里?它只是一个循环的问题.
#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;
}
Run Code Online (Sandbox Code Playgroud)
编辑:
使用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;
}
Run Code Online (Sandbox Code Playgroud)