将 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&lt;algorithm&gt;中写为:

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&amp; 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 &lt;string&gt; ;) +1 如果您将输入和结果变量命名为类似于 OP:std::vector&lt;int&gt; datastd::string result,这可能有助于教学法。 遗憾的是,后面可能不应该有分号。 @DietmarKühl 是的,但我想不出一个同样简单的解决方案来摆脱它。 我在想std::string s = v.empty()? std::string"": std::accumulate(v.begin() + 1, v.end(), v.front(), [](std::string const&amp; 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**?

将 Vector<int> 转换为字符串 [重复]

将 cv::Mat 转换为 vector<int>

将 std::vector<int> 从原始内存转换为数组[重复]

如何使用 SWIG 将 numpy 数组转换为 vector<int>&(参考)

如何在 .NET 中将 Vector128<float> 转换为 Vector128<int>?