将 vector<int> 转换为分隔字符串
Posted
技术标签:
【中文标题】将 vector<int> 转换为分隔字符串【英文标题】:Convert vector<int> to delimited string 【发布时间】:2013-12-28 17:28:13 【问题描述】:正如我所看到的here,有一种快速而简短的方法可以将向量转换为用 c# 中的字符分隔的字符串:
var result = string.Join(";", data);
var result = string.Join(";", data.Select(x => x.ToString()).ToArray());
我想知道 c++ 中是否有相同的方法来做到这一点?
【问题讨论】:
不,没有std::string
,如果你是这个意思!
【参考方案1】:
#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";
注意在 C++11 中,可以使用更通用的形式
using std::begin;
using std::end;
std::copy(begin(data), end(data), std::ostream_iterator<int>(oss, ";"));
如果可以使用 ADL,则不需要 using 声明(如上例所示)。
也有可能,但效率可能有点低:
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";
【讨论】:
@Robᵩ 我错过了#include <string>
;)
+1 如果您将输入和结果变量命名为类似于 OP:std::vector<int> data
和 std::string result
,这可能有助于教学法。
遗憾的是,后面可能不应该有分号。
@DietmarKühl 是的,但我想不出一个同样简单的解决方案来摆脱它。
我在想std::string s = v.empty()? std::string"": std::accumulate(v.begin() + 1, v.end(), v.front(), [](std::string const& s, int i) return s + ";" + std::to_string(i); );
【参考方案2】:
稍微扩展了已接受的答案,我采用了代码并制作了一个通用模板版本,它不仅适用于整数向量,而且适用于任何适用于字符串流的类型:
template <typename T>
std::string VectorToCSV(const std::vector<T>& vec)
std::ostringstream out;
if (!vec.empty())
std::copy(std::begin(vec), std::end(vec) - 1, std::ostream_iterator<T>(out, ";"));
out << vec.back();
return out.str();
这适用于模板参数推导,所以这样称呼它:
// Vector of ints example
std::vector<int> vec_of_ints = 1, 2, 3, 4;
std::string ints_csv = VectorToCSV(vec_of_ints);
// Vector of strings example
std::vector<std::string> vec_of_strings = "Hello", "World";
std::string strings_csv = VectorToCSV(vec_of_strings);
【讨论】:
以上是关于将 vector<int> 转换为分隔字符串的主要内容,如果未能解决你的问题,请参考以下文章
如何将 std::vector<thrust::device_vector<int>> 转换为 int**?
将 std::vector<int> 从原始内存转换为数组[重复]