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

C++17 what is the fastest way to convert list ( or other container ) to string cross platform

我有字符串列表

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)。

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

如果您对一个字符串进行多次追加,这可能意味着多次 alloc/copy/dealloc 循环。哪个贵。

因此,您 预先保留 额外容量:通过调用 string::reserve 容量增加到一次性指定的数量。然后你一点一点地添加你所有的东西(一个字节一个字节......,一个子串一个子串)并且它会全部适合(如果你正确计算了必要的容量)而不需要任何额外的 alloc/copy/dealloc.

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

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