c++ split模板实现

时间:2021-08-25 09:35:59

模板实现,重载+6:

template<typename _Elem, typename _Fty> inline
void split(const _Elem* s, const _Elem delim, _Fty op)
{
const _Elem* _Start = s; // the start of every string
const _Elem* _Ptr = s; // source string iterator
while( *_Ptr != '\0' )
{
if(delim == *_Ptr/* && _Ptr != _Start*/)
{
if (_Ptr != _Start)
op(std::basic_string<_Elem>(_Start, _Ptr));
_Start = _Ptr + 1;
}
++_Ptr;
}
if(_Start != _Ptr) {
op(std::basic_string<_Elem>(_Start, _Ptr));
}
} template<typename _Elem, typename _Fty> inline
void split(const _Elem* s, const _Elem* delims, _Fty op)
{
const _Elem* _Start = s; // the start of every string
const _Elem* _Ptr = s; // source string iterator
size_t _Lend = strlen(delims);
while ((_Ptr = strstr(_Ptr, delims)) != nullptr)
{
if (_Ptr != _Start)
{
op(std::basic_string<_Elem>(_Start, _Ptr));
}
_Start = _Ptr + _Lend;
_Ptr += _Lend;
}
if (*_Start) {
op(std::basic_string<_Elem>(_Start));
}
} /* any of delims */
template<typename _Fty> inline
void split(const std::string& s, const char* delims, _Fty op)
{
size_t start = 0;
size_t last = s.find_first_of(delims, start);
while (last != std::string::npos)
{
if (last > start)
op(s.substr(start, last - start));
last = s.find_first_of(delims, start = last + 1);
}
if (start < s.size())
{
op(s.substr(start));
}
} template<typename _Elem> inline
std::vector<std::string> split(const _Elem* s, const _Elem delim)
{
std::vector<std::basic_string<_Elem> > output;
nsc::split(s, delim, [&output](std::basic_string<_Elem>&& value)->void{
output.push_back(std::move(value));
});
return std::move(output);
} template<typename _Elem> inline
std::vector<std::string> split(const _Elem* s, const _Elem* delims)
{
std::vector<std::basic_string<_Elem> > output;
nsc::split(s, delims, [&output](std::basic_string<_Elem>&& value)->void{
output.push_back(std::move(value));
});
return std::move(output);
} inline
std::vector<std::string> split(const std::string& s, const char* delim )
{
std::vector< std::string > output;
nsconv::split(s, delim, [&output](std::string&& value)->void {
output.push_back(std::move(value));
});
return std::move(output);
}

測试代码:


int main(int, char**)
{ std::vector<std::string> values; split("#hello#@ffdsdf#@ffgfdg#@ gdsfd @ af#", "#", values); return 0;
}


c++ split模板实现的更多相关文章

  1. Magicodes&period;WeiChat——发送模板消息

    在微信开发中,经常会使用到模板消息.因此框架中对此进行了一些封装,并且提供了后台操作界面以及日志查看等功能,下面开始逐步介绍开发操作以及使用. 微信公众平台配置 首先,需要申请开通模板消息功能,如下图 ...

  2. 运用JavaScript构建你的第一个Metro式应用程序(onWindows 8)(三)

    原文 http://blog.csdn.net/zhangxin09/article/details/6793593 这是<运用 JavaScript构建你的第一个Metro式应用程序>系 ...

  3. 前端MVC学习总结(一)——MVC概要与angular概要、模板与数据绑定

    一.前端MVC概要 1.1.库与框架的区别 框架是一个软件的半成品,在全局范围内给了大的约束.库是工具,在单点上给我们提供功能.框架是依赖库的.AngularJS是框架而jQuery则是库. 1.2. ...

  4. Handlebars 模板引擎之前后端用法

    前言 不知不觉间,居然已经这么久没有写博客了,坚持还真是世界上最难的事情啊. 不过我最近也没闲着,辞工换工.恋爱失恋.深圳北京都经历了一番,这有起有落的生活实在是太刺激了,就如拿着两把菜刀剁洋葱一样, ...

  5. CSharpGL&lpar;12&rpar;用T4模板生成CSSL及其renderer代码

    CSharpGL(12)用T4模板生成CSSL及其renderer代码 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立 ...

  6. DotLiquid模板引擎简介

    DotLiquid是一个在.Net Framework上运行的模板引擎,采用Ruby的Liquid语法,这个语法广泛的用在Ruby on rails和Django等网页框架中. DotLiquid相比 ...

  7. 性能卓越的js模板引擎--artTemplate

    artTemplate能够将数据与View视图的分离,充分利用 javascript 引擎特性,使得其性能无论在前端还是后端都有极其出色的表现. 在 chrome 下渲染效率测试中分别是知名引擎 Mu ...

  8. ACM模板(持续补完)

    1.KMP #include<cstring> #include<algorithm> #include<cstdio> using namespace std; ...

  9. 模板化的七种排序算法,适用于T&ast; vector&lt&semi;T&gt&semi;以及list&lt&semi;T&gt&semi;

    最近在写一些数据结构以及算法相关的代码,比如常用排序算法以及具有启发能力的智能算法.为了能够让写下的代码下次还能够被复用,直接将代码编写成类模板成员函数的方式,之所以没有将这种方式改成更方便的函数模板 ...

随机推荐

  1. JS中new到底发生了什么

    outline prototype 与 __proto__ function 与 object new 到底发生了什么 prototype 与 __proto__ 首先说下在JS中比较容易让人困惑的  ...

  2. 使用cocos2d-x v3&period;1开发小游戏(基本框架)

    小游戏的组成 欢迎界面 在游戏资源未全部加载完之前就需要载入,避免进入游戏会有一段黑屏时间. 可以用来展示游戏名称或者开发者logo. 开始菜单界面 一般用于显示游戏名称和关卡选择(或者称游戏难度选择 ...

  3. &lbrack;翻译&rsqb;你不会想知道的kobject,kset,和ktypes

    ---------------------------------------------------------------------------------------------------- ...

  4. POJ 1775

    #include <iostream> using namespace std; ,,,,,,,,,}; bool boo; void DFS(int time,int sum); int ...

  5. MySql定位执行效率较低的SQL语句

    MySQL能够记录执行时间超过参数 long_query_time 设置值的SQL语句,默认是不记录的. 获得初始锁定的时间不算作执行时间.mysqld在SQL执行完和所有的锁都被释放后才写入日志.且 ...

  6. Android Studio安装教程

    Google在2013 I/O大会上发布Android Studio之后,广大Android开发者欢欣鼓舞,不过很快就有人出现问题,Android Studio无法安装,或者安装后无法启动,这篇文章就 ...

  7. 折返&lpar;Reentrancy&rpar;VS线程安全&lpar;Thread safety&rpar;

    在Wiki上,折返例如,下面的定义(接) In computing, a computer program or subroutine is called reentrant if it can be ...

  8. python crypto

    //安装crypto sudo apt-get install python-pip//安装pip命令工具 sudo pip install pycrypto//缺少环境-- sudo apt-get ...

  9. Java Swing JScrollPane 设置滚动量

    JScrollPane.getVerticalScrollBar().setUnitIncrement(20); 参考:http://bbs.csdn.net/topics/320249228

  10. linux基础 作业篇

    1.自动部署反向代理 web nfs #!/usr/bin/python #-*- coding:utf-8 -*- #开发脚本自动部署及监控 #1.编写脚本自动部署反向代理.web.nfs: #!/ ...