You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 15:27:08