将一组字符串转换为简单字符串 c++

8

我有一个字符串集合,set<string> aSet。怎么将这个集合转换成只有一个字符串,并且用逗号分隔每个元素?


1
连接字符串和逗号。 - 463035818_is_not_a_number
3个回答

11

这是一个选项:

std::ostringstream stream;
std::copy(aSet.begin(), aSet.end(), std::ostream_iterator<std::string>(stream, ","));
std::string result = stream.str();

3
这将在末尾带有一个逗号。 - malanb5

6
这是一种简单易懂的方法,没有复杂的东西:
string s;

for (auto const& e : aSet)
{
    s += e;
    s += ',';
}

s.pop_back();

1
是的,像往常一样对其进行剖析,如果证明效率低下:优化。首先要考虑可读性。 - emlai
C++编译器可能能够优化此方法固有的O(n2)复杂度,但我非常怀疑。 - chqrlie
1
@chqrlie 不高效在哪里?在我的快速测试中(连接2000个字符串),这个版本比上面的std::accumulate答案快50倍,比被接受的答案快四倍。 - James
1
@James:我猜测 std::string 的实现通过几何级数增长的方式重新分配后端存储来优雅地处理重复连接。这也可能是堆分配策略的副作用,其中块大小也会按几何级数增长,至少增长到字符串集合的长度。对于非常大的集合(数百万个字符串),您可能会遇到性能下降的情况。更保守的方法是测量结果集的长度并在1次调用中分配它。这需要2个循环。您也可以对此进行基准测试。 - chqrlie
1
@James:关于与Slava的答案的比较,我很高兴一个优雅的循环胜过了一个带有lambda函数的笨拙一行代码。核心解释是s += e; s+= ',';r = a + ',' + b;更有效率。 - chqrlie
显示剩余2条评论

5

accumulate 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; } );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接