更多课程 选择中心

C/C++培训
达内IT学院

400-996-5531

C++怎么分割字符串,C++字符串分割方法整理

  • 发布:C++培训
  • 来源:资料库
  • 时间:2017-05-18 14:53

c++的标准库string很多东西没有提供,包括但不限于split/join/slice, 而用到的机会又很多, 虽然利用标准库/第三方库实现split功能的方式有千千万, 本篇就按照how to split a string in c++中的几种方式给出一下,已经能覆盖到平时的使用场景了.

solution 1.1 : 字符流迭代器

使用场景:只有标准库可用; 只对空格进行分割
原理:输入流迭代器istream_iterator将输入流(文件/string等)分割成若干元素, 分割是通过迭代器自增实现, 每自增一次迭代器就从输入流中获取一个元素直到末尾, 而尾迭代器不需要赋值, 默认就空的; 流迭代器分割输入流的默认算法是按照空格来截取, 因此可以利用输入流迭代器的此种特性来做字符串分割.
代码:

std::istringstreamiss(text);std::istream_iterator<std::string> Itbegin =std::istream_iterator<std::string>(iss);std::istream_iterator<std::string> ItEnd =std::istream_iterator<std::string>();std::vector<std::string> results1(Itbegin, ItEnd);

solution 1.2 : 对输入流重载>>

使用场景: 只有标准库可用; 不仅仅只对空格进行分割
原理: 输入流迭代器的自增实际上是调用了string的非成员函数operator>>, 在里面给定了默认分割规则(按空格), 因此如果有其他需要, 可以继承string类, 并重载非成员函数std::istream &operator>>(std::istream &is, std::string &ouput), 在函数实现中给定(或者用模板类制定)分割规则.
代码:

classWordDelimitedByCommas :publicstd::string{ };std::istream &operator>>(std::istream &is, WordDelimitedByCommas &output) {returnstd::getline(is, output,','); } ...std::stringtext2 ="Let,me,split,this,into,words";std::istringstreamiss2(text2);autoItbegin2 =std::istream_iterator<WordDelimitedByCommas>(iss2);autoItEnd2 =std::istream_iterator<WordDelimitedByCommas>();std::vector<std::string> results2(Itbegin2, ItEnd2);

solution 2: boost::split

使用场景: 有boost可用; 分割规则客户端指定
原理: client提供容器vector<string>, boost分割之后存入其中
代码:

std::vector<std::string> results3; boost::split(results3, text, boost::is_any_of(","));

solution 3: using ranges

使用场景: 可以使用其他第三方库, head-only库range-v3
原理:range-v3提供pipeline风格语法
代码:

std::stringtext ="Let me split this into words";autosplitText = text | view::split(' ');

solution 4:

使用场景: 编译器支持c++14; 待分割字符有一定规则(可以用正则表达式抽象)
原理: 正则表达式的迭代器std::regex_token_iterator按照正则因子的规则分割字符串A
代码:

std::regexsep ("[ ,.]+");std::sregex_token_iteratortokens(text.cbegin(), text.cend(), sep, -1);std::sregex_token_iteratorend;std::cout<<"[solution:regex]"<<std::endl;for(; tokens !=end; ++tokens){std::cout<<"token found: "<< *tokens <<"\n"; }

总结

不需要自己利用标准库提供的能力拼凑拼装一个split的方式基本都在上面了.

  • 如果一般的需求就用boost::split就很好了, 灵活且易用;

  • 如果要求更高, 需要提取特定格式内的字符串, 那么可以考虑regex方式;

  • 大量需要用到range-v3的特性的时候, 就用range方案, 最简洁.

预约申请免费试听课

填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:快速掌握C语言函数,C语言函数的定义和函数调用过程
下一篇:什么是编程语言、为什么入门都选C语言

超全的C语言标识符知识

C指针——指针类型转换

C指针——指针和结构类型的关系

C指针——数组和指针的关系

Copyright © 2023 Tedu.cn All Rights Reserved 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有

选择城市和中心
黑龙江省

吉林省

河北省

湖南省

贵州省

云南省

广西省

海南省