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

C++是否有类似Python的字符串/列表切片语法?

C++中类似Python切片语法的实现方案

C标准库的std::string并不支持Python那种[start:end]的直接切片语法,你写的name[1:-1]会报错,原因是C的[]运算符仅接受单个整数索引,不支持范围式写法。下面提供几种实现类似Python切片逻辑的方法:

1. 使用std::string::substr成员函数(最常用)

substr的参数为起始索引和要截取的长度,要实现Python中person[1:-1](从索引1到倒数第二个字符)的效果,可计算对应长度:

#include <iostream>
#include <string>

using namespace std;

int main(){
    string name = "Jimmy";
    // 起始索引1,截取长度为总长度 - 起始索引 - 1(排除最后一个字符)
    cout << name.substr(1, name.size() - 2) << endl; // 输出: imm
}
  • 说明:name.size()返回字符串长度(示例中为5),5-2=3,即从索引1开始截取3个字符,正好得到"imm"。

2. 封装函数支持负数索引

如果习惯Python的负数索引(如-1代表最后一个字符),可以自己封装函数处理索引转换:

#include <iostream>
#include <string>
#include <algorithm> // 用于max、min

using namespace std;

string slice(const string& s, int start, int end) {
    // 转换负数起始索引
    if (start < 0) start += s.size();
    // 转换负数结束索引
    if (end < 0) end += s.size();
    // 确保索引在合法范围内
    start = max(0, start);
    end = min(static_cast<int>(s.size()), end);
    // 处理起始索引大于等于结束索引的情况
    if (start >= end) return "";
    return s.substr(start, end - start);
}

int main(){
    string name = "Jimmy";
    cout << slice(name, 1, -1) << endl; // 输出: imm
}

3. C++20及以上使用范围库std::views::slice

若使用C++20或更高版本,可利用标准库的范围视图实现切片:

#include <iostream>
#include <string>
#include <ranges>

using namespace std;

int main(){
    string name = "Jimmy";
    // views::slice(start, end) 是左闭右开区间,和Python切片规则一致
    auto sliced_view = name | ranges::views::slice(1, name.size() - 1);
    // 将视图转换为字符串输出
    cout << string(sliced_view) << endl; // 输出: imm
}
  • 注意:std::views::slice不直接支持负数索引,需手动转换为正数索引后使用。

内容的提问来源于stack exchange,提问作者Bingus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 13:31:06