结合字符串向量

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+()

  • 顺便说一句,这种方法可能会非常糟糕,因为可能涉及到复制/实现的重要性. (3认同)
  • `std::reduce` (C++17) - 比 `std::accumulate` 更快:`std::string a = std::reduce(vec.begin(), vec.end(), std::字符串(“”));` (2认同)

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)


pix*_*ase 9

下面的代码片段在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秒.

  • @pixelgrease,cat 函数是什么?它是如何定义的?谢谢 (3认同)
  • 创建`std :: sring`调用`reserve(final-size)`可能更快,然后只需使用+ =`即可,因为缓冲区已经是正确的大小了,应该快一些。 (2认同)

Pra*_*rav 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;
}
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)

  • 或者使用适当的函子与 for_each 而不是自由函数。节省您拥有全局变量 (2认同)