我有一个字符串集合,set<string> aSet
。怎么将这个集合转换成只有一个字符串,并且用逗号分隔每个元素?
这是一个选项:
std::ostringstream stream;
std::copy(aSet.begin(), aSet.end(), std::ostream_iterator<std::string>(stream, ","));
std::string result = stream.str();
string s;
for (auto const& e : aSet)
{
s += e;
s += ',';
}
s.pop_back();
O(n2)
复杂度,但我非常怀疑。 - chqrliestd::string
的实现通过几何级数增长的方式重新分配后端存储来优雅地处理重复连接。这也可能是堆分配策略的副作用,其中块大小也会按几何级数增长,至少增长到字符串集合的长度。对于非常大的集合(数百万个字符串),您可能会遇到性能下降的情况。更保守的方法是测量结果集的长度并在1次调用中分配它。这需要2个循环。您也可以对此进行基准测试。 - chqrlies += e; s+= ',';
比r = a + ',' + b;
更有效率。 - chqrlieaccumulate example中有一段代码,可以将int向量连接为字符串,并且可以很容易地转换为您所需的格式:
std::string s = std::accumulate( std::begin(aSet),
std::end(aSet),
std::string{},
[](const std::string& a, const std::string &b ) {
return a.empty() ? b
: a + ',' + b; } );