繁体   English   中英

转换矢量<int>分隔字符串</int>

[英]Convert vector<int> to delimited string

正如我在这里看到的那样,有一种快速简便的方法可以将向量转换为用 c# 中的字符分隔的字符串:

var result = string.Join(";", data); 
var result = string.Join(";", data.Select(x => x.ToString()).ToArray()); 

我想知道 c++ 中是否有相同的方法来做到这一点?

#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";
}

NB在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) + ";";

可以通过<algorithm> std::accumulate写入:

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参数。)


没有尾随分号的版本(感谢DietmarKü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";

稍微扩展一下已接受的答案,我采用了代码并制作了一个通用模板版本,该版本不仅适用于整数向量,而且适用于任何可与 stringstream 一起使用的类型:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM