繁体   English   中英

在恒定时间内修剪 C++ 字符串

[英]Trimming C++ string in constant time

是否有 STL/库方法可以在恒定时间内减小字符串大小(修剪它)。

在 C 中,这可以通过在最后一个索引后面添加 '\\0' 来在恒定时间内完成。

C++ 调整大小复杂性未定义,很可能是 O(N)

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

@SamVarshavchik 在评论中很腼腆,但值得一提的是:在许多实现中,包括 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 不拥有数据,因此一旦原始字符串超出范围,您就无法使用它,并且您不希望以可能导致其重新分配的方式修改原始字符串。

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没有在堆上分配内存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM