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
- 用于缩小容量,直到它与当前所需的一样大字符串的内容。
(*) 是的,我忽略了小字符串优化 ...
我有字符串列表
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
- 用于缩小容量,直到它与当前所需的一样大字符串的内容。
(*) 是的,我忽略了小字符串优化 ...