我是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());
答案 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数组出来作为123
或1 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'是操作+调用的结果,并且正在累积连接的字符串。这很好,因为它没有为每个中间结果分配临时值,也没有复制。当然,对于字符串调整大小,您可能会生成副本 - 但是,这是另一回事。
性能差异非常重要。