Tip of the Week #10: Splitting Strings, not Hairs

2023-11-01

Tip of the Week #10: Splitting Strings, not Hairs

Originally published as totw/10 on 2012-08-16
By Greg Miller (jgm@google.com)
Updated 2018-01-24
I tend to have an odd split in my mind. –John Cleese

在任何通用目的的编程语言中将一个string切割成一个子串是一个很常见的任务,C++也不例外。当谷歌出现这种需求时,许多工程师发现自己需要通过扩展头文件的方式来扩展分割字符串的功能。你需要寻找满足您需求的输入参数、输出参数和语义的神奇组合。在研究了600多行标题中的50多个函数以后,你可能错误的将新的分割函数命名为SplitStringViewToDequeOfStringAllowEmpty()

为了处理这个问题,C++库的团队实现了一个新的API用于实现字符串分割的功能,其头文件在absl/strings/str_split.h

这个新的API将许多功能类似的分割函数替换成了一个单个的 absl::StrSplit()函数。这个函数接收一个将被分割的string和一个分隔符作为输入,absl::StrSplit()返回结果将会适配调用者指定的类型。absl::StrSplit的实现是高效的,因为其内部广泛使用了absl::string_view。除非调用者明确将结果存储在字符串对象的集合中(会复制其数据),否则不会复制数据的。

说够了,让我们看一些例子:

// Splits on commas. Stores in vector of string_view (no copies).
std::vector<absl::string_view> v = absl::StrSplit("a,b,c", ',');

// Splits on commas. Stores in vector of string (data copied once).
std::vector<std::string> v = absl::StrSplit("a,b,c", ',');

// Splits on literal string "=>" (not either of "=" or ">")
std::vector<absl::string_view> v = absl::StrSplit("a=>b=>c", "=>");

// Splits on any of the given characters (',' or ';')
using absl::ByAnyChar;
std::vector<std::string> v = absl::StrSplit("a,b;c", ByAnyChar(",;"));

// Stores in various containers (also works w/ absl::string_view)
std::set<std::string> s = absl::StrSplit("a,b,c", ',');
std::multiset<std::string> s = absl::StrSplit("a,b,c", ',');
std::list<std::string> li = absl::StrSplit("a,b,c", ',');

// Equiv. to the mythical SplitStringViewToDequeOfStringAllowEmpty()
std::deque<std::string> d = absl::StrSplit("a,b,c", ',');

// Yields "a"->"1", "b"->"2", "c"->"3"
std::map<std::string, std::string> m = absl::StrSplit("a,1,b,2,c,3", ',');

更多的细节相关的信息可以去看absl/strings/str_split.h,对于如何使用SplitAPI可以看absl/strings/str_split_test.cc里面有很多examples

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

Tip of the Week #10: Splitting Strings, not Hairs 的相关文章

  • 拼接数组的高级语法 concat 每天一个JS小tips

    直接举栗子 var arr1 span class token operator 61 span span class token punctuation span span class token number 1 2 span 3 sp
  • 那些提升效率的tips(不定期更新中...)

    电脑插了网线可以上网却显示无internet 打开设备管理器 xff08 找不到在控制面板中搜索 设备管理器 xff09 找到网络适配器 选择网卡驱动程序 xff0c 先禁用设备再开启设备 xff08 重启 xff09 用MarkDownl
  • Tips and Tricks for Visual Question Answering: Learnings from the 2017 Challenge阅读笔记

    本文提出了一种基于深度神经网络的VQA模型 xff0c 并报告了一套广泛的实验来确定每个设计选择的贡献和替代设计的性能 它提供了关于VQA模型各个组件重要性的指示器 xff0c 一 Summary of findings 1 使用一个sig
  • (pycharm,typora,chrome补充中……)使用中,小tips

    欢迎关注 xff1a 天际使徒的个人博客 文章目录 pycharmpython解释器界面小说明 xff08 转载 https www cnblogs com xiashuai future p 11192346 html xff09 连按两
  • 指针与引用的区别,指针与引用的底层实现是否一样?

    指针与引用 在More Effective C 的条款一有详细讲述 条款一 指针与引用的区别 指针与引用看上去完全不同 指针用操作符 和 gt 引用使用操作符 但是它们似乎有相同的功能 指针与引用都是让你间接引用其他对象 你如何决定在什么时
  • python离线安装第三方库

    python离线安装第三方库 安装包下载 cmd实现离线安装 zip文件包下载安装 whl文件下载安装 由于内外网的物理隔离 导致很多python的第三方库无法在线安装 只能选择离线安装了 离线安装具体如下 安装包下载 python除了本身
  • Tip of the Week #10: Splitting Strings, not Hairs

    Tip of the Week 10 Splitting Strings not Hairs Originally published as totw 10 on 2012 08 16 By Greg Miller jgm google c
  • 电子书djvu格式简介zz

    DjVu是由美国AT T实验室于1996年开发成功的一项新的图片压缩技术 DjVu的主要技术是将图像分为背景层 纸的纹理和图片 和前景层 文本和线条 通过将文字和背景分离开来 DjVu可以用高分辨率来还原文字 使锐利边缘得以保留 并最大限度
  • Linux shell 从文件中随机选择内容

    如果需要从文件中随机选择一定行的内容 可以借助sort 命令 如下 使用sort 命令将文件随机排序 选择前100行 sort random sort file head n 100
  • pytorch 将模型作为特征提取器(提取中间层特征)

    目的 需要加载自己训练好的最好模型作为一个特征提取器 也就是说需要提取最后一层全连接层输出的内容 解决方法 参考了两个方法 详见文末 设参数直接提取 准备一个toy model来说明 class MyModel nn Module def
  • Windows11 文件选择打开方式时卡死 解决

    发生的现象 在 打开方式 窗口的地址栏粘贴应用的地址 gt 打开方式界面卡死 完整步骤 左键点击打开epub文件 gt 跳出 寻找一个应用以打开此 epub文件 gt 选择 在电脑上选择应用 gt 弹出 打开方式 窗口 gt 在 打开方式
  • 如何用logging记录python实验结果?

    做python实验有时候需要打印很多信息在控制台 console 但是控制台的信息不方便回顾和保存 故而可以采用logging将信息存储起来 先新建一个文件message log 代码如下 import logging logging ba
  • windows的cmd常用命令

    文章目录 一 位 二 cmd基本操作 1 win R启动运行 2 打开cmd 3 运行的命令 三 cmd常用命令 1 功能性命令 2 文件操作 3 shutdown 4 tasklist命令 5 taskkill命令 6 查看日志 四 cm
  • win10远程桌面的坑

    win10的远程桌面的确是清晰度非常好 操作非常流程的 但是还是有坑的 举两个踩坑例子 1 录屏软件在远程桌面退出后无效了 无法录制屏幕了 2 监控客户端在退出远程桌面后 再进去远程桌面 打圈圈卡死 因此一些应用不适合在win10远程桌面办
  • 批量修改文件夹名称——规则重命名(Excel+Python脚本两种方式)

    批量修改文件夹名称 场景 在进行神经网络训练的时候 有些时候获取到的数据集的命名是不规则的 不便于直观理解数据的结构 由此需要进行批量重命名 本文提供Excel Python脚本两种方式 Excel 如下图所示 文件是命名是乱序无规则的 在
  • Windows 仍在设置此设备的类配置。 (代码 56)

    家里电脑有线网卡出现 Windows 仍在设置此设备的类配置 代码 56 解决方法 键盘按win r 弹出运行窗口 输入 redegit 进入注册表 删除HKEY CLASSES ROOT CLSID 3d09c1ca 2bcc 40b7
  • git拉取和推送如何指定远程服务器的ssh端口

    家里弄了个嵌入式服务器 里面安装了git 申请了动态公网ip 上行速度40Mbps 可比国内的服务器带宽大多了 所以要好好利用起来 但是由于是动态公网ip 因此做了端口映射 指定端口9999到嵌入式服务器的22端口 如何让git push
  • Windows巧用git实现笔记自动备份

    Windows巧用git实现笔记自动备份 准备git仓库 配置自动上传脚本 设置 Windows 自动定时任务 参考文献 今天突然发现 可以 使用Gitee加上Windows定时任务 实现Windows端的笔记 自动备份 多端同步 历史回溯
  • MathType 使用的解决方案

    目前遇到这种情况 MathType联网后显示证书失效 需要重新认证或者购买 或者是MathType成了精简版 只剩两行了 解决方案 分为两步 先禁止MathType联网 再删除注册表多余信息 1 禁止MathType联网 打开 控制面板 g
  • 7z命令行加密文件夹和文件名

    因为有时候需要将非常机密的东西上传到网盘 毕竟网盘也不一定安全 而每次都鼠标点添加密码很麻烦 然后就用命令行脚本弄快 电脑安装7zip 在你要压缩的文件夹打开命令行 7z a r pABC12345 mhe on test 7z a 添加f

随机推荐

  • 虚幻4学习笔记(3)地形工具和植被

    地形工具和植被 地貌编辑器 生成斜坡 雕刻工具 编辑样条曲线 光照进行构建解决方法 导入灰度图 植被工具使用 植被碰撞 B站UP谌嘉诚课程 https www bilibili com video BV164411Y732 地貌编辑器 生成
  • 分布式一致性算法的重要原理:鸽巢原理

    在分布式BASE理论 数据一致性模型有哪些 中 我们谈到了BASE理论的最终一致性 以及简单介绍了数据一致性模型 但我们都是站在一个使用者的角度 在发出数据更新的请求给分布式系统之后 观察返回的数据是否更新 为了更好使用 理解分布式系统 不
  • C#入门学习-----制作AVI播放器

    本实例主要用到了Microsoft Animation Control Version 6 0 组件 该组件可以一帧一帧地播放AVI文件 用到该组件 必须将Microsoft Animation Control Version 6 0组件添
  • 如何在宝塔面板后的阿里云服务器运行Flask项目并公网可以访问?

    在你的服务器安装宝塔面板 宝塔面板是服务器运维管理系统 使用宝塔前 手工输入命令安装各类软件 操作起来费时费力并且容易出错 而且需要记住很多Linux的命令 非常复杂 使用宝塔后 2分钟装好面板 一键管理服务器 鼠标点几下就能替代以前的复杂
  • JVM类加载过程和编译器优化

    文章目录 1 加载 2 链接 2 1 验证 2 2 准备 2 3 解析 3 初始化 3 1 类初始化练习 3 2 懒汉式单例练习 4 类加载器 4 1 启动类加载器 4 2 扩展类加载器 4 3 双亲委派模式 4 4 线程上下文类加载器 4
  • PCL——VTK读取、保存.ply模型数据

    目录 一 读取 ply文件 1 代码示例 2 结果展示 一 保存 ply文件 1 代码示例 2 结果展示 一 读取 ply文件 ReadPLY 是VTK内置的mesh模型读取函数 该函数仅支持 ply格式的mesh网格数据不支持读取 ply
  • 【STM32】HAL库——ADC

    前期准备 STM32CubeMX STM32RCT6核心板 IDE Keil MDK ARM STM32CubeMX部分 1 配置时钟 选择STM32F103RCTx系列芯片 配置时钟的同时会自动配置IO口引脚 将HCLK设置为最大频率72
  • Altera FPGA PCIE 例程仿真

    由于刚开始学PCIE接口 所以按照官方给的例程进行仿真操作 下面主要介绍下仿真的具体步骤 该例子是采用Cyclone V器件进行仿真 PCIE为gen1X4 的 Quartus II 版本号为15 0 Modelsim为ModelsimSE
  • 小米商城网页制作大全-完结篇

    时隔多日 小米商城网页基本完成 跳转的第二页面没有做 在这过程中遇到了很多小而细的问题 例如浏览器兼容性 字符图标不显示 动画效果不起作用等 抽时间整理一下 再继续完善 效果图如下 实际右侧固定栏只有个人中心 购物车 联系客服 回到顶部四项
  • 【websocket定义和使用】

    文章目录 前言 一 websocket定义 2 websocket使用 总结 前言 websocket就是服务端和客户端建立长连接的一种方式 多在直播 弹幕 聊天业务中使用 具体的自己百度吧 一 websocket定义 代码如下 示例 fu
  • docker 服务编排

    一 docker 服务编排 微服务的应用系统中一般包含若干个微服务 每个微服务一般都会部署多个实例 如果每个微服务都要手动启停 维护的工作量会很大 要从dockerfile build image 或者去 dockerhub 拉取image
  • Flutter 指针事件原理&点击穿透

    隔离的这14天 慢慢的研究了Flutter的指针事件 在这个过程中 又重新梳理了一下Element和Render Tree的形成过程 这篇文章 主要对指针事件在Fluter中如何下发到各个组件的过程进行梳理 指针是指针 手势是手势 手势是指
  • 软件工程课件

    软件工程 考点概述 软件工程概述 能力成度模型 能力成熟度模型集成 软件过程模型 逆向工程 软件需求 需求获取 数据流图 需求定义 考点概述 重点章节 软件工程概述 之前老版教程的 之前考过 能力成度模型 记忆 能力等级 和 特点 能力成熟
  • (读书笔记)python数据处理-(python读取csv、excel文件)

    文章目录 python读取csv文件 python解析excel文件 1 查看工作表中的sheet名 2 查看工作表指定sheet的内容 3 查看sheet中每个元素 4 将提取信息以字典形式展示 python 判断excel文件是否存在
  • Java使用RabbitMQ

    一 简介 rabbitMQ是什么 怎么用 怎么安装 网上文档一大把 请自行百度 本文给出的代码是rabbitMQ的fanout交换机模式 最原生的java代码 如果需要使用其他模式的rabbitMQ 请自行更改相应部分代码 二 代码 rab
  • 浅学Oracles数据库

    一 Oracle数据库中的数据类型 1 1 关于mysql数据库中的数据类型 int 整数型 bigint 长整型 float 单精度浮点型 double 双精度浮点型 char 字符型 长度不可变 varchar 字符型 长度可变 dat
  • C 函数参数传递一级指针和二级指针的区别

    文章目录 一 概念 二 函数参数为一级指针例子 1 程序一 指针类型为基本数据 2 程序二 参数为结构体 不是指针类型 3 程序三 参数类型为结构体指针 三 函数参数为二级指针例子 1 程序四 二级指针类型为基本数据类型 2 程序五 二级指
  • Element UI DatePicker 监听年月切换按钮并获取变更

    需求 在每切换一次年月时调用接口获取数据 传参为当前切换成的年月 需要监听DatePicker是否显示 用input获得焦点时触发的focus事件 element自带 并绑定4个切换按钮的click事件 html
  • Vue3 优雅地监听 localStorage 变化

    最近在研究框架 也仔细用了Vue3一些功能 今天分享一次我的实践 Vue3如何监听localStorage的变化 为什么要这样做 原生的localStorage只能监听同源地址下不同页面的localStorage变化 作为单页面应用 显然不
  • Tip of the Week #10: Splitting Strings, not Hairs

    Tip of the Week 10 Splitting Strings not Hairs Originally published as totw 10 on 2012 08 16 By Greg Miller jgm google c