结合字符串向量

时间:2009-12-31 16:16:02

标签: c++ string vector stl

我一直在阅读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;
}

如何将字符串连接在一起?

4 个答案:

答案 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;
  }