在我看到here时,有一种快速简短的方法可以将矢量转换为字符串,并用c#中的字符分隔:
var result = string.Join(";", data);
var result = string.Join(";", data.Select(x => x.ToString()).ToArray());
我想知道c ++中是否有相同的方法来做到这一点?
答案 0 :(得分:12)
#include <sstream>
#include <string>
#include <vector>
#include <iterator>
#include <iostream>
int main()
{
std::vector<int> data = {42, 1, 2, 3, 4, 5};
std::ostringstream oss;
std::copy(data.begin(), data.end(), std::ostream_iterator<int>(oss, ";"));
std::string result( oss.str() );
std::cout << result << "\n";
}
N.B。在C ++ 11中,您可以使用更通用的表单
using std::begin;
using std::end;
std::copy(begin(data), end(data), std::ostream_iterator<int>(oss, ";"));
如果可以使用ADL,则不需要使用声明(如上例所示)。
也可能,但效率可能稍低:
std::string s;
for(auto const& e : v) s += std::to_string(e) + ";";
可以通过std::accumulate
中的<algorithm>
写为:
std::string s = std::accumulate(begin(v), end(v), std::string{},
[](std::string r, int p){ return std::move(r) + std::to_string(p) + ";"; });
(IIRC有一些消除复制的方法,可能是通过引用std::string& r
获取lambda参数。)
没有尾部分号的版本(感谢Dietmar Kühl):
std::vector<int> data = {42, 1, 2, 3, 4, 5};
std::ostringstream out;
if (!v.empty())
{
std::copy(v.begin(), v.end() - 1, std::ostream_iterator<int>(out, ";"));
out << v.back();
}
std::string result( out.str() );
std::cout << result << "\n";