C++ 复制集合<;int>;用逗号分隔的std::string?

C++ 复制集合<;int>;用逗号分隔的std::string?,c++,csv,C++,Csv,假设我有一个ints的通用列表。它可以是std::set: std::set<int> myInts; myInts.insert(1); myInts.insert(2); myInts.insert(3); 这是可行的,但是 它在末尾加了一个“,” 因为我需要字符串作为输出,所以我必须使用一个额外的中间字符串流,这会导致不必要的性能开销 我也可以使用基本的foreach,在这里我可以纠正最后一个逗号问题,还可以将这些int转换为string,并将它们连接到输出字符串,但这并不是

假设我有一个
int
s的通用列表。它可以是
std::set

std::set<int> myInts;
myInts.insert(1);
myInts.insert(2);
myInts.insert(3);
这是可行的,但是

  • 它在末尾加了一个“,”
  • 因为我需要字符串作为输出,所以我必须使用一个额外的中间字符串流,这会导致不必要的性能开销
  • 我也可以使用基本的foreach,在这里我可以纠正最后一个逗号问题,还可以将这些int转换为string,并将它们连接到输出字符串,但这并不是最好(最快)的方法

    Boost不可用,并且编译器支持C++14


    set
    转换为CSV字符串的最佳方式(性能方面)是什么?(我可以测量
    ostream\u迭代器
    方法和
    foreach
    方法之间的执行时间差,但这里的问题是,是否还有其他方法可以满足我的所有愿望?

    最简单的方法可能是:

    std::set<int> set = {1, 2, 3, 4};
    std::string s = std::to_string(*set.begin());
    
    std::for_each(std::next(set.begin()), set.end(), [&s] (int val) {
        s.append(", ").append(std::to_string(val));
    });
    
    std::set={1,2,3,4};
    std::string s=std::to_string(*set.begin());
    std::for_each(std::next(set.begin())、set.end()、[&s](int-val){
    s、 append(“,”).append(std::to_string(val));
    });
    

    如果你关心性能,你需要预先分配一个足够大的缓冲区,然后使用To-CARS或SaveTFF。我不认为这种情况对于优化是重要的,因为转换为CSV是一种罕见的操作。

    std::set<int> set = {1, 2, 3, 4};
    
    //remember to check for errors when using sprintf, I am not.
    char buf[1024];
    int idx = std::sprintf(buf, "%d", *set.begin());
    
    std::for_each(std::next(set.begin()), set.end(), [&buf, &idx] (int val) {
        idx += std::sprintf(buf + idx, ", %d", val);
    });
    
    std::string s(buf);
    
    std::set={1,2,3,4};
    //记住在使用sprintf时检查错误,我不是。
    char-buf[1024];
    int idx=std::sprintf(buf,“%d”,*set.begin());
    std::for_each(std::next(set.begin()),set.end(),[&buf,&idx](int-val){
    idx+=std::sprintf(buf+idx,,%d,,%val);
    });
    std::字符串s(buf);
    
    我个人会使用
    copy(v.begin(),v.end()-1,ostream_迭代器(cout,“,”)“< /COD>”,而不是手动将最后一个元素添加到输出中。这很好,但是我需要<代码> STD::String 。如果考虑性能,考虑用“替换代码< > STD::SET/CODE >其他的东西。对于大多数大小/操作序列,它优于不同的数据结构,特别是用于遍历……对于“我需要字符串”。注释。你应该能够用
    std::ostringstream
    替换
    cout
    …这能回答你的问题吗?有很多选择。如果这真的是你需要优化的东西,你可能应该为它编写自己的函数。有一个例子正好说明了这一点。简单的一个例子是
    std::t如何转换(std::begin(set)、std::end(set)、std::back_插入器、[](int const&i){return i+'0';})
    ?我的意思是,对于每个
    ,这是
    tansform
    好还是比
    差?我不认为这是你想要它做的,它只在整数介于0和9之间时起作用,并且它不会在它们之间插入“,”。
    
    std::set<int> set = {1, 2, 3, 4};
    
    //remember to check for errors when using sprintf, I am not.
    char buf[1024];
    int idx = std::sprintf(buf, "%d", *set.begin());
    
    std::for_each(std::next(set.begin()), set.end(), [&buf, &idx] (int val) {
        idx += std::sprintf(buf + idx, ", %d", val);
    });
    
    std::string s(buf);