我可以实现线性(或接近)复杂性连接字符串没有分配
Can I achieve linear (or close to) complexity concatenating strings without allocation?
{
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
缓冲区也不应该影响您的性能(显著)。
相关文章:
- 使用短运算符的字符串连接有区别吗?
- 字符串连接时间复杂度 c++
- 如何将两个 jlong 数据类型转换为 jstring,然后将两个字符串连接在一起以便从 JNI 将字符串返回给 jav
- 如何在 C 宏中将变量字符串与文字字符串连接起来?
- C++中干净高效的字符串连接
- 如何将 Unicode 字符串连接成字符串以传递到 mysql 调用中
- 如何与字符串连接thar数组
- 如何将平台^字符串转换为wstring,然后与L字符串连接
- 如何在c++中进行快速字符串连接
- 在C++中,相当于CPython字符串连接
- 如何在 c++ 中使用 STL 将带有空格的字符串连接成一个字符串
- C++将三个char*字符串连接在一起
- 尝试通过二叉树中的递归返回字符串(连接)
- 使用流的字符串连接返回垃圾
- 将字符串变量与整数和文本字符串连接起来的 C++ 字符串流
- 将 int 变量与字符串连接会导致奇怪的输出
- C++ 将常量字符 * 与字符串连接起来,仅打印常量字符 *
- 通过将模板参数与字符串连接起来生成C++类型名
- 将我的对象与字符串连接
- 没有得到预期的结果字符串连接