内容来源 : how to split a string in c++c++
c++的标准库string不少东西没有提供,包括但不限于split/join/slice
, 而用到的机会又不少, 虽然利用标准库/第三方库实现split
功能的方式有千千万, 本篇就按照how to split a string in c++中的几种方式给出一下,已经能覆盖到平时的使用场景了.git
使用场景:只有标准库可用; 只对空格进行分割
原理:输入流迭代器istream_iterator将输入流(文件/string等)分割成若干元素, 分割是经过迭代器自增实现, 每自增一次迭代器就从输入流中获取一个元素直到末尾, 而尾迭代器不须要赋值, 默认就空的; 流迭代器分割输入流的默认算法是按照空格来截取, 所以能够利用输入流迭代器的此种特性来作字符串分割.
代码:github
std::istringstream iss(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);
使用场景: 只有标准库可用; 不单单只对空格进行分割
原理: 输入流迭代器的自增其实是调用了string
的非成员函数operator>>
, 在里面给定了默认分割规则(按空格), 所以若是有其余须要, 能够继承string
类, 并重载非成员函数std::istream &operator>>(std::istream &is, std::string &ouput)
, 在函数实现中给定(或者用模板类制定)分割规则.
代码:正则表达式
class WordDelimitedByCommas : public std::string { }; std::istream & operator>>(std::istream &is, WordDelimitedByCommas &output) { return std::getline(is, output, ','); } ... std::string text2 = "Let,me,split,this,into,words"; std::istringstream iss2(text2); auto Itbegin2 = std::istream_iterator<WordDelimitedByCommas>(iss2); auto ItEnd2 = std::istream_iterator<WordDelimitedByCommas>(); std::vector<std::string> results2(Itbegin2, ItEnd2);
使用场景: 有boost可用; 分割规则客户端指定
原理: client提供容器vector<string>
, boost分割以后存入其中
代码:算法
std::vector<std::string> results3; boost::split(results3, text, boost::is_any_of(","));
使用场景: 能够使用其余第三方库, head-only库range-v3
原理:range-v3
提供pipeline风格语法
代码:tcp
std::string text = "Let me split this into words"; auto splitText = text | view::split(' ');
使用场景: 编译器支持c++14; 待分割字符有必定规则(能够用正则表达式抽象)
原理: 正则表达式的迭代器std::regex_token_iterator按照正则因子的规则分割字符串
代码:函数
std::regex sep ("[ ,.]+"); std::sregex_token_iterator tokens(text.cbegin(), text.cend(), sep, -1); std::sregex_token_iterator end; std::cout<<"[solution:regex]"<<std::endl; for(; tokens != end; ++tokens){ std::cout << "token found: " << *tokens << "\n"; }
不须要本身利用标准库提供的能力拼凑拼装一个split
的方式基本都在上面了.this
boost::split
就很好了, 灵活且易用; regex
方式;range-v3
的特性的时候, 就用range方案, 最简洁.