我有一个字符串列表
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
-用来缩小容量,直到它正好是字符串的当前内容所需要的。
(*)是的,我省略了小字符串优化…