用copy()连接字符串

时间:2014-12-02 23:07:21

标签: c++ string-concatenation

我是C ++的新手,我想知道有没有办法使用vector< string>copy()中的字符串连接成一个字符串。我知道我可以使用accumulate(),但我想知道什么是错的&#34;引擎盖下#34;使用此代码:

string concat_v (const vector<string>& v) {
  string s;
  copy(v.begin(), v.end(), back_inserter(s));
  return s;
}

或者用:

s.insert(s.end(), v.begin(), v.end());

4 个答案:

答案 0 :(得分:3)

您的代码示例存在的问题是,您无法将string复制到需要char的内容。这与以下问题相同:

string s = "Hello";
char ch = s;         // ???

std::accumulate功能完全符合您的要求,我不知道为什么您仍然想知道是否有办法:)使用它的方法是:

string s;
s = std::accumulate(v.begin(), v.end(), s);

调用operator+进行累积。还有一个版本的累积调用你提供的自定义函数。

答案 1 :(得分:1)

如果确实希望使用std::copy代替std::accumulate来完成工作,您可以使用一些中间人来完成这项工作,例如std::stringstream

string concat_v (const vector<string>& v) {
  stringstream s;
  copy(v.begin(), v.end(), ostream_iterator<string>(s));
  return s.str();
}

出于这个特定目的,所有输入都是相同类型并且支持加法运算符(并且它可以执行您想要的操作),accumulate似乎是明确的选择。当/如果你想要一个连接字符串时,使用字符串流可能更好,即使(例如)添加项可能会产生完全不同的东西(例如,你想要一个包含{1,2,3}的int数组出来作为1231 2 3,而非6)。

答案 2 :(得分:0)

如果您正在寻找单行,我会使用accumulate。我认为你提到的两个方法并不存在。

string concat_v (const vector<string>& v) {
  string s;
  s = accumulate(v.begin(), v.end(), string());
  return s;
}    

答案 3 :(得分:0)

使用std :: accumulate在性能方面带来了明显的优势。

在积累中,我们有

  while (first!=last) {
     init = init + *first;
     ++first;
  }

'init'是操作+调用的结果,并且正在累积连接的字符串。这很好,因为它没有为每个中间结果分配临时值,也没有复制。当然,对于字符串调整大小,您可能会生成副本 - 但是,这是另一回事。

性能差异非常重要。