如何在C++中以O(1)时间复杂度移除字符串首字符?
用C++实现O(1)时间“移除”字符串首字符的方案
首先得明确:如果要真正修改原std::string对象,让它的内容变成"hajib",那不可能做到O(1)——因为std::string的字符是连续存储的,移除首字符后必须把后面所有字符往前移动一位,这一步必然是O(n)复杂度,你提到的substr和erase都是这个逻辑。
但如果只是需要访问从第二个字符开始的内容,不需要修改原字符串,那可以用C++17引入的std::string_view来实现O(1)操作:
#include <string> #include <string_view> int main() { std::string str = "Shajib"; // 创建视图,从原字符串第1个索引(首字符是索引0)开始,长度为原长度减1 std::string_view str_view(str.data() + 1, str.size() - 1); // 此时str_view等价于"hajib",访问操作都是O(1),无字符拷贝或移动 // 若要转成std::string仍会触发O(n)拷贝,但只读场景下用string_view足够 }
要是你不想依赖C++17及以上特性,也可以自己封装一个简单的字符串视图类,只保存偏移后的指针和剩余长度,同样能实现O(1)访问:
#include <string> class StringView { private: const char* ptr_; size_t length_; public: StringView(const std::string& str, size_t start_idx) : ptr_(str.data() + start_idx), length_(str.size() - start_idx) {} // 实现基础访问方法 char operator[](size_t idx) const { return ptr_[idx]; } size_t size() const { return length_; } // 转std::string的方法(此步骤为O(n)) std::string to_string() const { return std::string(ptr_, length_); } }; int main() { std::string str = "Shajib"; StringView sv(str, 1); // sv即可代表"hajib",所有访问操作都是O(1) }
总结:
- 要修改原字符串得到"hajib":不可能O(1),必须O(n)
- 要只读访问去掉首字符后的内容:用
string_view或自定义视图,实现O(1)操作
内容的提问来源于stack exchange,提问作者Md Shajib
相关产品推荐
相关产品推荐

