我可以实现线性(或接近)复杂性连接字符串没有分配

Can I achieve linear (or close to) complexity concatenating strings without allocation?

本文关键字:字符串 连接 分配 复杂性 线性 实现 接近 我可以      更新时间:2023-10-16
{
   std::string s = "this is a string ";
   std::string res = std::string();
   int sLength = s.length();
   for(int i = 0; i < sLength; i++)
      res += s[i];
}

我认为c++的复杂度是严格线性的(关于字符分配),而c#的复杂度是二次的。

然而,事实上,在这种情况下,内存没有事先分配,我们实际上也在看二次复杂度吗?如果是,分配一个字符数组会帮助我们实现线性复杂性吗?

您可以通过调用std::string::reserve来实现线性复杂性。这将防止在字符串增长时重新分配:

std::string s = "this is a string ";
std::string res = "what is this? ";
res.reserve(s.length() + res.length());
for(int i = 0; i < s.length(); i++)
   res += s[i];

显然在现实生活中你不会这样连接字符串

根据cppr,在字符串中添加字符具有恒定的复杂性(尽管我认为这带有隐式的"平摊",如string::push_back)。

所以你的代码已经具有线性复杂性了。

如果您关心分配成本并且事先有大小的上限,您也可以只reserve足够的空间以避免任何重新分配和复制字符串。那么,即使是普通的char缓冲区也不应该影响您的性能(显著)。