假设我有一个int
s的通用列表。它可以是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, ","));
这是有效的,但是
- 它放入一个额外的"最后
- 由于我需要字符串作为输出,所以我必须使用一个中间的额外字符串流,这会导致不必要的性能开销
我也可以使用基本的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);