我听到一些人表达了对 std::string 中“+”运算符的担忧,以及各种加快连接速度的变通方法。这些真的有必要吗?如果是这样,在 C++ 中连接字符串的最佳方法是什么?
原文由 sneg 发布,翻译遵循 CC BY-SA 4.0 许可协议
我听到一些人表达了对 std::string 中“+”运算符的担忧,以及各种加快连接速度的变通方法。这些真的有必要吗?如果是这样,在 C++ 中连接字符串的最佳方法是什么?
原文由 sneg 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以尝试为每个项目保留内存:
namespace {
template<class C>
constexpr auto size(const C& c) -> decltype(c.size()) {
return static_cast<std::size_t>(c.size());
}
constexpr std::size_t size(const char* string) {
std::size_t size = 0;
while (*(string + size) != '\0') {
++size;
}
return size;
}
template<class T, std::size_t N>
constexpr std::size_t size(const T (&)[N]) noexcept {
return N;
}
}
template<typename... Args>
std::string concatStrings(Args&&... args) {
auto s = (size(args) + ...);
std::string result;
result.reserve(s);
return (result.append(std::forward<Args>(args)), ...);
}
原文由 voltento 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
除非你真的需要效率,否则额外的工作可能不值得。 只需使用运算符 += 代替,您可能会获得更好的效率。
现在,在免责声明之后,我将回答您的实际问题……
STL 字符串类的效率取决于您使用的 STL 的实现。
您可以通过 c 内置函数手动进行连接,从而 保证效率 并 更好地控制 自己。
为什么 operator+ 效率不高:
看一下这个界面:
可以看到每个 + 之后都会返回一个新对象。这意味着每次都使用一个新的缓冲区。如果您正在执行大量额外的 + 操作,则效率不高。
为什么可以提高效率:
实施注意事项:
绳子数据结构:
如果您需要真正快速的连接,请考虑使用 绳索数据结构。