将集合<int>复制到逗号分隔的 std::string?



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

std::set<int> myInts;
myInts.insert(1);
myInts.insert(2);
myInts.insert(3);

我想将它们转换为值之间用逗号分隔的std::string(而不是在最后一个值之后!(。

我在这里搜索了一下,有很多不同的解决方案。

一个例子是一个简单的单行:

copy(v.begin(), v.end(), ostream_iterator<string>(cout, ","));

这是有效的,但是

  1. 它放入一个额外的"最后
  2. 由于我需要字符串作为输出,所以我必须使用一个中间的额外字符串流,这会导致不必要的性能开销

我也可以使用基本的foreach,在这里我可以更正最后一个逗号问题,还可以将这些int转换为字符串,并将它们连接到输出字符串,但这感觉不是最好(最快(的方法。

Boost不可用,编译器是CLANG,支持C++14。

set<int>转换为CSV字符串的最佳方式(性能方面(是什么?(我可以测量ostream_iterator方法和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));
});

如果您关心性能,则需要预先分配一个足够大的缓冲区,并使用to_chars或sprintf。我认为这种情况对优化来说并不重要,因为转换为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);

最新更新