2014-12-02 186 views
0

我是新的C++,我不知道有没有办法来连接从vector< string>串到使用copy()一个字符串。我知道我可以使用accumulate(),但我不知道什么是错的“引擎盖下”使用此代码:串联字符串复制()

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

回答

3

与您的代码样本的问题是,你不能将string复制到预计需要char的内容。这是同样的问题:

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

std::accumulate功能做你要求什么,我不知道为什么你仍然想知道如果有一种方法:)使用它的方式是:

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

这就要求operator+做积累。还有一个累积的版本,它会调用您提供的自定义函数。

+0

他可能不知道如何使用它(“运算符+”与二进制版本)。我必须去查看它。 (我从你这样的人那里学到很多整洁的东西)。 – jww 2014-12-02 23:16:28

+0

@jww添加示例 – 2014-12-02 23:27:32

0

如果你正在寻找一个班轮,我会使用accumulate。我认为你提到的两个人没有办法。

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

我不认为这会按书面形式工作。 'std :: accumulate'使用第三个参数的类型作为累加器,当作为参数传递给函数模板时''“'的类型是'char const *'。我会做第三个参数'std :: string()'。 – 2014-12-03 00:02:29

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似乎是明确的选择。当/如果你想要一个连接字符串时,使用stringstream可能会更好,即使(例如)添加项目可能会产生完全不同的东西(例如,你想要一个包含{1,2,3}的int数组出现作为1231 2 3,而不是6)。

0

与std :: accumulate一起在性能方面带来显着优势。

在累加,我们有

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

“初始化”是操作+调用的所得,并累积所串接字符串。这很好,因为它不会为每个中间结果分配临时对象,也不会复制临时对象。当然,对于字符串大小调整,您可能会生成副本 - 但这是另一回事。

性能差异不是微不足道的。