【C++实现python字符串函数库】一:分割函数:split、rsplit

2023-05-16

【C++实现python字符串函数库】split()与rsplit()方法

前言

本系列文章将介绍python提供的字符串函数,并尝试使用C++来实现这些函数。这些C++函数在这里做单独的分析,最后我们将把这些函数放在命名空间中,真正作为一个函数库来使用。

本节内容

在本节,我们将实现两个python字符串分割函数。这两个函数的函数原型为:

split(spe = None,maxsplit= -1)

rsplit(spe= None ,maxsplit = -1)

这两个方法使用参数spe作为分隔符,将字符串切割成指定的maxsplit段,并以列表的形式返回切割后的字符串。默认的分隔符是空格,默认情况下对所有的分隔符进行分割:

>>> 
>>> s = "I'm not to see you"
>>> s.split()
["I'm", 'not', 'to', 'see', 'you']
>>> 
>>> s.rsplit()
["I'm", 'not', 'to', 'see', 'you']
>>> 

可以看到字符串根据空格进行分割,分割成的各段作为列表的元素组成了列表并返回。
我们再来看更多的例子:

分隔成指定段数

>>> 
>>> s = 'aaaaaaaaaaa'
>>> s.split('a',2) #依据'a'进行分割,最大分割数为2(分割两次)
['', '', 'aaaaaaaaa']
>>> 
>>> 
>>> s.split('a',1000)#分隔数偏多
['', '', '', '', '', '', '', '', '', '', '', '']
>>> 
>>> 
>>> s.split('a',-19)#分割数为负数
['', '', '', '', '', '', '', '', '', '', '', '']
>>> 

split方法从左至右处理字符串,而rsplit方法从右至左处理字符串:

>>> ##两个方法的区别
>>> s
'aaaaaaaaaaa'
>>> s.split('a',2)
['', '', 'aaaaaaaaa']
>>> s.rsplit('a',2)
['aaaaaaaaa', '', '']
>>> 

C++实现

我们使用容器vector来保存字符串分割后的元素。尽管我们的目标是实现split与rsplit这两个函数,但是模块化的思想促使我们定义出以下这5个函数:

  1. reverse_strings :用于rsplit_whitepace与rsplit函数。
  1. split_whitespace :用于split调用,以空格作为分隔符对整个字符串做分隔处理(默认)
  1. rsplit_whitespace :用于 rsplit调用,以空格作为分隔符对整个字符串做分隔处理(默认)
  1. split 我们所期待的函数
  1. rsplit 我们所期待的函数

在函数的实现中,我们会调用到C++容器提供的一些接口:vector容器的push_backsubstr等。

头文件与宏定义

在这两个函数的实现中,我们需要如下头文件与宏定义:

#include<vector>
#include<string>
#define MAX_32BIT_INT 2147483467

倒序函数reverse_strings

这个函数提供给rsplit函数使用。具体使用继续向下看。


//采用std的swap函数
void reverse_strings(std::vector< std::string > & result)
{
    for (std::vector< std::string >::size_type i = 0; i < result.size() / 2; i++)
    {
        std::swap(result[i], result[result.size() - 1 - i]);
    }
}

spilt()方法默认情况下处理函数:split_whitespace


    void split_whitespace(const std::string &str, std::vector<std::string> &result, int maxsplit)
    {
        std::string::size_type i, j, len = str.size();
        for (i = j = 0; i < len;)
        {
            
            while (i < len&&::isspace(str[i]))
                i++;
            j = i;

        
            while (i < len&&!::isspace(str[i]))
                i++;
            if (j < i)
            {
                if (maxsplit-- <= 0)
                    break;
                result.push_back(str.substr(j, i - j));
                while (i < len&&::isspace(str[i]))
                    i++;
                j = i;
            }
        }
        if (j < len)
        {
            result.push_back(str.substr(j, len - j));
        }
    }

split()函数

void split(const std::string &str, std::vector<std::string>&result, const std::string &sep, int maxslit)
    {
        result.clear();
        if (maxslit < 0)
            maxslit = MAX_32BIT_INT; //MAX_32BIT_INT是自己定义的一个整数,当maxslit为负数时,对整个字符串做切割处理
        //split函数默认为空格为分隔符
        if (sep.size() == 0)
        {
            //调用函数进行空格切割
            split_whitespace(str, result, maxslit);
            return;
        }
        std::string::size_type i, j, len = str.size(), n = sep.size();
        i = j = 0;
        while (i + n <= len)
        {
            if (str[i] == sep[0] && str.substr(i, n)== sep)
            {
                if (maxslit-- <= 0)
                    break;
                result.push_back(str.substr(j, i - j));
                i = j = i + n;
            }
            else
                i++;
        }

        //剩下部分
        result.push_back(str.substr(j, len - j));
    }

rsplit()方法默认情况处理函数

void rsplit_whitespace(const std::string &str, std::vector<std::string>&result, int maxsplit)
    {
        std::string::size_type i,j,len = str.size();
        for (i = j = len; i > 0;)
        {
            while (i > 0 && ::isspace(str[i - 1]))
                i--;
            j = i;
            while (i > 0 && !::isspace(str[i - 1]))
                i--;
            if (j > i)
            {
                if (maxsplit-- <= 0)
                    break;
                result.push_back(str.substr(i, j - i));
                while (i > 0 && ::isspace(str[i - 1]))
                    i--;
                j = i;
            }
        }
        if (j > 0)
        {
            result.push_back(str.substr(0, j));
        }

        reverse_strings(result);
        
    }

rsplit()函数

void rsplit(const std::string &str, std::vector<std::string>&result, const std::string &sep, int maxsplit)
    {
        if (maxsplit < 0)
        {
            split(str, result, sep, maxsplit);
            return;
        }
        result.clear();
        if (sep.size() == 0)
        {
            rsplit_whitespace(str, result, maxsplit);
            return;
        }

        std::string::size_type i, j;
        std::string::size_type len = str.size();
        std::string::size_type n = sep.size();

        i = j = len;
        while (i >= n)
        {
            if (str[i - 1] == sep[n - 1] && str.substr(i - 1, n) == sep)
            {
                if (maxsplit-- <= 0)
                    break;
                result.push_back(str.substr(i, n));
                i = j = i - n;
            }
            else
            {
                i--;
            }
        }
        result.push_back(str.substr(0, j));
        reverse_strings(result);
    }

测试

    string s = "I'm not to see you";
    vector<string> result;
    string sep = " ";
    split(s,result,sep,10);

结果:
610439-20150908171019637-1317282233.png

    string  b = "abc abc abc abc";
    vector<string>result;
    string sep = "a";
    split(b, result, sep, 2);
    for (int i = 0; i < result.size(); i++)
        cout << result[i] << endl;

结果:
610439-20150908171029778-326752924.png

    string  b = "abc abc abc abc";
    vector<string>result;
    string sep = "a";
    rsplit(b, result, sep, 2);
    for (int i = 0; i < result.size(); i++)
        cout << result[i] << endl;

结果:
610439-20150908171042434-613347585.png

感谢耐心看完,如果有错误的地方,恳请指出。希望喜欢C++与python的同学多交流。

转载于:https://www.cnblogs.com/QG-whz/p/4792315.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C++实现python字符串函数库】一:分割函数:split、rsplit 的相关文章

  • ros开启快速转发模式

    RB CCR设备开启FastTrack ip firewall filter add chain 61 forward action 61 fasttrack connection connection state 61 establish
  • ROS的脚本多拨

    ros设置单网卡拨多ADSL 使用vrrp 有些版本有问题 xff0c 使用5 2破解版本测试成功 1 创建100个vrrp 并绑定到wan口下 for i from 1 to 100 do 61 interface vrrp add co
  • zabbix4.0 相关的拓扑图及centos的虚拟配置

    zabbix的拓扑图相关资料 https blog 51cto com qicheng0211 1591073 zabbix配合 grafana zabbix 安装好后 参考 grafana 官方文档 https grafana com g
  • 通过TCP协议发送DNS请求

    通过TCP协议发送DNS请求的方法 文章出处 xff1a http www bingtech net wordpress 2011 04 233 下载dnsapi dll文件 然后到Google xff0c 搜索 替换系统文件 replac
  • PLC实现积分的计算方法

    以电机运行转速来计算电机运行圈数为例 在PLC中定义定时器中断 xff0c 中断时间设置为200ms 转载于 https www cnblogs com chenpan6227 p 11558647 html
  • PLC中相关量的斜坡控制

    转载于 https www cnblogs com chenpan6227 p 11558750 html
  • PLC中m法计算电机转速

    转载于 https www cnblogs com chenpan6227 p 11558715 html
  • oauth2.0+jwt 源码探究之旅

    oauth2 0协议是一种对外开放式协议 xff0c 主要用于第三方登录授权 例如 xff1a 在豆瓣官网点击用qq登录 以及微信的授权都是基于oauth2 0协议做的 oauth2 0的认证流程 xff08 A xff09 用户打开客户端
  • 读取 appsettings.json

    Appsettings json 配置 xff1a 个配置文件就是一个json文件 xff0c 并且是严格的json文件 xff0c 所有的属性都需要添加 引号 下图是一个常规的代码示例 xff1a 34 UrlString 34 34 U
  • OVN学习整理

    部署OVN网络拓扑 OVN 安装软件包 etc yum repos d CentOS OpenStack ocata repo yum list installed grep openvswitch openvswitch x86 64 1
  • 关于python写文件时的回车符

    测试环境Windows 回车符是0x0D和0x0A俩个字符 xff0c 在python中记为 39 r n 39 写文件时 xff0c 如果文件打开格式为 39 w 39 xff0c 39 n 39 就按照0D 0A写入了文件 xff0c
  • 《对软件工程课程的期望》

    自我介绍 xff1a 各位老师 xff0c 同学大家好 我是软件三班 李德帅 xff0c 大三了我希望通过这学期学习软件工程这门课 xff0c 拓展丰富自己的知识领域 xff0c 提升自己的对软件编程的思维和素质 xff0c 并且还要在与小
  • 软件工程概论作业1

    1需要网站系统开发需要掌握的技术 1 gt html与css网页开发基础 2 gt jsp语言 3 gt javaBean技术 4 gt servlet技术 5 gt 数据库的操作技术 2本次课堂测试的程序源代码 1 xff09 登陆页面
  • lisp填写明细表对话框_中望机械绘图中,明细表功能的试用技巧

    在机械设计过程中 xff0c 明细表 即 BOM表 是CAD设计图纸中的重要组成部分 xff0c 它包含了图纸中所有零件的类型 序号 名称 材料 代号 规格 数量以及重量等信息 xff0c 是指导物流部门和生产部门采购的关键文件 xff0c
  • Ubuntu16.04 中文乱码问题解决

    Ubuntu16 04 中文乱码问题解决 要适配一个服务 xff0c 用了mysql5 7的版本 xff0c 最新的Ubuntu适配起来头秃 xff08 直接用mysql8 0又出现jdbc接口修改的问题 xff09 xff0c 所以直接切
  • Centos 安装 kubectl kubelet kubeadm

    cat lt lt EOF gt etc yum repos d kubernetes repo kubernetes name 61 Kubernetes baseurl 61 https mirrors aliyun com kuber
  • 51单片机 中断控制蜂鸣器

    51单片机 中断控制蜂鸣器 单片机通过使用外部中断控制蜂鸣器 include lt reg51 h gt define uint unsigned int define uchar unsigned char 定义蜂鸣器连接的引脚 sbit
  • 正则表达式的分组

    一 概念 分组 我们已经提到了怎么重复单个字符 xff08 直接在字符后面加上限定符就行了 xff09 xff1b 但如果想要重复一个字符串又该怎么办 xff1f 你可以用小括号来指定子表达式 也叫做分组 xff0c 然后你就可以指定这个子
  • linux 触控板 不识别,关于Ubuntu下触摸板失灵的解决方法一例

    最近突然发现Ubuntu下触摸板失灵了 xff0c 从网上找方法 xff0c 什么换驱动 xff0c 改代码 xff0c 都试过了 xff0c 结果不仅没修好反而系统瘫了 后来看到有人说重启电脑 xff0c 我就一遍一遍重启 xff0c 还
  • 通达OA应用中心使用手册(脚本编写指南)

    脚本编写必备基础 1 1 什么是脚本 脚本是一段 PHP 代码 xff0c 可以被应用中心执行以实现特定功能 应用中心支持通过脚本实现以下功能 xff1a 自定义计算函数 自定义提取触发器 自定义回填触发器 编写脚本对于应用中心来说不是必须

随机推荐

  • 常用HTTP消息头

    Cache control Cache Control 是最重要的规则 这个字段用于指定所有缓存机制在整个请求 响应链中必须服从的指令 这些指令指定用于阻止缓存对请求或响应造成不利干扰的行为 这些指令通常覆盖默认缓存算法 缓存指令是单向的
  • 用rplidar建图 运行rbx1_nav/gmapping_demo.launch报错

    1 rplidar开启 2 turtlrbot bringup 3 运行 roslaunch rbx1 nav gmapping demo launch 报如下错误 xff1a MessageFilter target 61 odom Dr
  • FreeRTOS 和uCOS II的简单比较

    转载 xff1a http www viewtool com bbs forum php mod 61 viewthread amp tid 61 114 这是两种RTOS 现在粗略比较一下 freeRTOS比uCOS II优胜的地方 xf
  • ubuntu配置XManager可用

    前提 xff1a 确保XManager所在PC和ubuntu所在主机的网络可相互访问 一 配置ubuntu 1 安装gdm软件 sudo apt get install gdm 安装后配置成默认的light模式即可 2 查看是否已经安装 s
  • ROS 自定义消息类型

    引言 学习ROS的过程中 xff0c 在话题的发布与订阅之间 xff0c 我一直在思考 xff0c 我们能不能定义自己的话题名 xff0c 甚至在编写我们自己的ROS软件包时 xff0c 定义我们自己的消息类型 首先能不能定义自己的话题名
  • char ch= 中 什么意思java_问一下java里的char到底是什么

    我们上课用的联系学java的软件是readytoprogramJAVAIDE xff0c 学到char变量的时候出了点问题 xff0c 教材上教的是让我们输 xff1a charch1 ch2 ch3 ch1 61 c readChar c
  • 理科大学可能类似纹路里

    11月5日 xff0c 第二届上海市政府新闻办公室推出全新形象片 上海 恒新之城 xff0c 以更为开放 更求创新 更讲包容的姿态展示新时代的风采 xff0c 迎接的到来 开放 创新 包容已成为上海最鲜明的品格 xff0c 这种品格是新时代
  • 三星 S10 运行 Ubuntu 系统

    导读DeX 是一种模仿桌面操作系统的用户 UI 界面 xff0c 把支持 DeX 的三星手机用数据线连上外置显示器 xff0c 用户就可以获得一种类似桌面系统的使用体验 三星 S8 Note 8 S9 Note 9 S10 系列都支持 De
  • Ubuntu的妥协将支持精选的32位应用

    据外媒Tom 39 s hardware xff0c Ubuntu开发人员Canonical在早先的时候宣布Ubuntu 19 10将不再更新32位软件包和应用程序 xff0c 引来了诸多应用开发者的不满 现在 xff0c Ubuntu方面
  • Jdk升级到11引起的问题:程序包javax.xml.bind.annotation不存在

    Jdk升级到11引起的问题 xff1a 程序包javax xml bind annotation不存在 Jdk12 都发布了 xff0c 我也下载一个玩一玩吧 刚准备要下载 xff0c 发现之前已经下载了一个11 xff0c 那就11 吧
  • 车载系统测试-功能测试第一天

    一 混动车型测试前注意 1 踩刹车加启动按钮 xff0c 进入ok模式 xff0c OK模式下可以进行常规测试 xff1b 点击启动按钮进入acc on模式 xff1b 在ok模式下 xff0c 充电不可用时可以踩油门进行充电 xff1b
  • 去除office非正版提示的方法(转)

    又是office的问题 每次回家都碰到相关问题 这次是微软正版计划的认证 去百度一下发现是一个 34 Office 正版增值计划通知 KB949810 CHS 34 补丁的问题 症状是 打开Office中的相应组件如WORD xff0c 那
  • 在SQLSERVER中如何检测一个字符串中是否包含另一个字符串

    当charindex返回值大于0时则包含 为0不包含 select CHARINDEX 39 456 39 39 123456 39 SQL语句使用CHARINDEX函数 xff0c 来测试一个字符串中是否包含另一个字符串中的方法 xff1
  • vim全选,全部复制,全部删除

    全选 xff08 高亮显示 xff09 xff1a 按esc后 xff0c 然后ggvG或者ggVG 全部复制 xff1a 按esc后 xff0c 然后ggyG 全部删除 xff1a 按esc后 xff0c 然后dG 解析 xff1a gg
  • FTP命令收集

    FTP FTP命令是Internet用户使用最频繁的命令之一 xff0c 熟悉并灵活应用FTP的内部命令 xff0c 可以大大方便使用者 xff0c 并收到事半功倍之效 如果你想学习使用进行后台FTP下载 xff0c 那么就必须学习FTP指
  • 如何屏蔽Chrome新标签页中8个缩略图

    PS xff1a 该经验本源来百度 雨燕之子 技术流匠师 xff0c 然本文图片等整理均属原创 第一步 xff1a 安装扩展Stylish 第二步 xff1a 安装成功红写入新样式 xff0c 名称自己起个喜欢的就好 xff0c 代码内容
  • VNC 登录上去灰屏,没有shell脚本,鼠标变成X

    CenterOS 1 安装vncserver yum install tigervnc server y 2 vncpasswd 设置pwd 3 etc sysconfig vncservers VNCSERVER 61 34 1 root
  • 计算机编程之高级语言

    高级语言 High level programming language 相对于机器语言 machine language xff0c 是一种指令集的体系 这种指令集 xff0c 称机器码 machine code xff0c 是电脑的CP
  • C/C++ 笔试,难倒我哉

    2012 6 27日下午 xff0c 去了一个软件公司笔试面试 xff0c 3道题目 xff0c 都是 C 语言的编程题 xff0c 题意简单明了 xff0c 写起来好麻烦 xff0c 而且是在纸上写的 xff0c 平常习惯了写写改改 xf
  • 【C++实现python字符串函数库】一:分割函数:split、rsplit

    C 43 43 实现python字符串函数库 split 与rsplit 方法 前言 本系列文章将介绍python提供的字符串函数 xff0c 并尝试使用C 43 43 来实现这些函数 这些C 43 43 函数在这里做单独的分析 xff0c