我可以实现线性(或接近)复杂性连接字符串没有分配
本文关键字:字符串 连接 分配 复杂性 线性 实现 接近 我可以 | 更新日期: 2023-09-27 17:50:34
{
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
缓冲区也不应该影响您的性能(显著)。