C++17 将列表或其他容器转换为字符串跨平台的最快方法是什么

问题描述

我有字符串列表

std::list<std::string> list = { "--version","--setcolor","--setint" };
list.push_back("--command1");
list.push_back("--command2");
list.push_back("--command3");

基本上是最后想将它们转换为字符串的命令列表
最后,该列表最多可包含 100 个命令。
在 C++17 中最快的方法是什么?

更新
它也可以是数组或其他容器 最终结果应该是这样的:

std::string s = "--version --setcolor --setint --command1 --command2 --command3";

谢谢

解决方法

使用 std::string 作为累加器(例如,“字符串缓冲区”,如在 Java 或 C# 中所见)是 C++ 中的标准做法,并且 C++11/14/17/20 没有添加任何内容使其成为“更快”。

简单地将子字符串的长度相加 - 以及它们之间的分隔符 - string::reserve 目标字符串中有足够的容量,然后 string::append 远离 ...

[@Justin 在评论中回答,但也把它放在这里,因为评论是短暂的]

在 C++ 中,字符串是可修改的(与 Java 和 C# 等其他语言不可变)不同。因此您可以更改它们,包括向它们添加字符(例如,通过 string::append)。

有两个相关的概念:字符串的大小——它现在有多少个字符,以及字符串的容量——它可以容纳多少给定已经分配给它的存储。如果容量与大小相同,那么向字符串添加任何内容将需要从堆中分配新的存储空间,并将字符串的当前内容复制到其中(并将旧存储重新分配回堆.) (*) 如果容量大于大小,那么如果新字符适合可用容量,则附加新字符将不需要分配/复制/解除分配。

如果你对一个字符串进行多次追加,这可能意味着多次分配/复制/释放循环。哪个很贵。

因此,您可以预先预留额外容量:通过调用 string::reserve,容量增加到一次性指定的数量。然后你一点一点地添加你所有的东西(一个字节一个字节......,一个子字符串一个子字符串),它会全部适合(如果你正确计算了必要的容量),而无需任何额外的分配/复制/交易。

string::reserve 讨论了 here at cppreference。当您在那里时,请查看 string::capacity - 以查找字符串的当前容量,为什么不也查看 string::resize - 用于缩小容量,直到它与当前所需的容量一样大字符串的内容。

(*) 是的,我忽略了小字符串优化...

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...