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);
这是可行的,但是
将
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);