以恒定时间修剪C ++字符串

问题描述 投票:0回答:2

是否有一个STL /库方法来减少字符串大小(在恒定时间内对其进行修剪)。

在C语言中,只需在最后一个索引后面加上'\ 0',就可以在固定时间内完成此操作。

C ++调整大小兼容性未定义,并且很可能是O(N)

http://www.cplusplus.com/reference/string/string/resize/

c++ c++11 stl
2个回答
1
投票

@@ SamVarshavchik在评论中有点co,但值得说明:在许多实现中,包括libstdc ++,std::string::resize()会通过减小字符串的长度而不重新分配/复制来在恒定时间内减小字符串的大小。数据:https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/bits/basic_string.tcc。 O(n)的估计值是如果您增加大小,则迫使该字符串重新分配并复制过来。

[或者,在C ++ 17中,std::string_view大致不变,与通过拍入空字节来“修剪” C字符串相对应。它不需要分割字符串内容即可获取字符串的一部分(指针+大小),然后可以将其传递给各种STL函数或从流中打印出来。

std::string hello_world = "hello world";
auto hello = std::string_view(hello_world.data(), 5);
std::cout << hello; // prints hello

注意:string_view不拥有数据,因此一旦原始字符串超出范围,就无法使用它,并且您不想以可能导致其变形的方式修改原始字符串。重新分配。


1
投票

C ++ 17方式,我们可以在O(1)中实现substr操作。

https://www.modernescpp.com/index.php/c-17-avoid-copying-with-std-string-view

std::string_view也不要在堆上为大字符串分配内存。std::string在堆上分配内存,但std::string例外,MSVC和GCC的大小为15,而Clang的大小为23。上面提到的std::string以下大小没有在堆上分配内存。

© www.soinside.com 2019 - 2024. All rights reserved.