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

这里有两个相关的概念:字符串的大小,即它现在有多少个字符;字符串的容量,即给定已分配给它的存储空间,它可以容纳多少字符。如果能力是一样的大小然后添加任何字符串,需要一个新的从堆中分配的存储空间,和一个字符串的当前内容复制到它(和回收旧的存储回堆。)(*)如果能力

比大小然后添加新的角色不需要分配/复制/回收如果新角色适应能力。如果你对一个字符串进行多次追加,这可能意味着多次alloc/copy/dealloc循环。这是昂贵的。

因此,您可以预先保留额外容量:通过调用string::reserve,容量增加到一次射击指定的数量。然后你把所有的东西一点一点地加起来(一个字节一个字节……

string::reserve在cppreference中讨论。当你在那里检查string::capacity-找到字符串的当前容量,为什么不看看string::resize-用来缩小容量,直到它正好是字符串的当前内容所需要的。

(*)是的,我省略了小字符串优化…

相关内容

  • 没有找到相关文章

最新更新