c++ split模板实现
模板实现,重载+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模板实现的更多相关文章
- Magicodes.WeiChat——发送模板消息
在微信开发中,经常会使用到模板消息.因此框架中对此进行了一些封装,并且提供了后台操作界面以及日志查看等功能,下面开始逐步介绍开发操作以及使用. 微信公众平台配置 首先,需要申请开通模板消息功能,如下图 ...
- 运用JavaScript构建你的第一个Metro式应用程序(onWindows 8)(三)
原文 http://blog.csdn.net/zhangxin09/article/details/6793593 这是<运用 JavaScript构建你的第一个Metro式应用程序>系 ...
- 前端MVC学习总结(一)——MVC概要与angular概要、模板与数据绑定
一.前端MVC概要 1.1.库与框架的区别 框架是一个软件的半成品,在全局范围内给了大的约束.库是工具,在单点上给我们提供功能.框架是依赖库的.AngularJS是框架而jQuery则是库. 1.2. ...
- Handlebars 模板引擎之前后端用法
前言 不知不觉间,居然已经这么久没有写博客了,坚持还真是世界上最难的事情啊. 不过我最近也没闲着,辞工换工.恋爱失恋.深圳北京都经历了一番,这有起有落的生活实在是太刺激了,就如拿着两把菜刀剁洋葱一样, ...
- CSharpGL(12)用T4模板生成CSSL及其renderer代码
CSharpGL(12)用T4模板生成CSSL及其renderer代码 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立 ...
- DotLiquid模板引擎简介
DotLiquid是一个在.Net Framework上运行的模板引擎,采用Ruby的Liquid语法,这个语法广泛的用在Ruby on rails和Django等网页框架中. DotLiquid相比 ...
- 性能卓越的js模板引擎--artTemplate
artTemplate能够将数据与View视图的分离,充分利用 javascript 引擎特性,使得其性能无论在前端还是后端都有极其出色的表现. 在 chrome 下渲染效率测试中分别是知名引擎 Mu ...
- ACM模板(持续补完)
1.KMP #include<cstring> #include<algorithm> #include<cstdio> using namespace std; ...
- 模板化的七种排序算法,适用于T* vector<T>以及list<T>
最近在写一些数据结构以及算法相关的代码,比如常用排序算法以及具有启发能力的智能算法.为了能够让写下的代码下次还能够被复用,直接将代码编写成类模板成员函数的方式,之所以没有将这种方式改成更方便的函数模板 ...
随机推荐
- QT学习 之 文本文件读写
上一章我们介绍了有关二进制文件的读写.二进制文件比较小巧,却不是人可读的格式.而文本文件是一种人可读的文件.为了操作这种文件,我们需要使用QTextStream类.QTextStream和QDataS ...
- 关于sql 中 group by 和 having
今天看到园里一篇文章(http://www.cnblogs.com/sheldon-lou/p/4881230.html)中面试中有关sql 查询方面的问题, 想想自己从上大学就学习数据库,到后来自己 ...
- source code of MES Data
<HTML> <HEAD> <TITLE>TELOGS</TITLE> </HEAD> <BODY> <?php /* c ...
- for循环语句之兔子生崽
有一对幼兔,幼兔经过一个月长为小兔,小兔经过一个月长为大兔并且生下一对幼兔,而且大兔每月还会生下一对幼兔,问N个月后有多少对兔子 Console.WriteLine("请输入经过了几个月:& ...
- Android模拟器启动异常
设置系统环境变量的 ANDROID_SDK_HOME为任意一个目录,我的目录:C:\android_avd, 关闭eclipse,然后重新启动eclipse, 删除之前创建的AVD, 然后重新创建,即 ...
- Java 重入锁 ReentrantLock
本篇博客是转过来的. 但是略有改动感谢 http://my.oschina.net/noahxiao/blog/101558 摘要 从使用场景的角度出发来介绍对ReentrantLock的使用,相对来 ...
- Week11(11月21日)
Part I:提问 =========================== 1.如何编辑更新一条记录? Part II:案例学习 =========================== MusicSt ...
- Microsoft Visual Studio 发展历史
Microsoft Visual Studio(简称VS)是美国微软公司的开发工具包系列产品.VS是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具.代码管控工具. ...
- Jekyll学习:基本使用方法
Jekyll是一个简单的博客.静态网站生成工具.利用它可以快速的搭建一个网站.并且完全免费的在 GitHub 上发布网站 — 自定义域名. 一.环境搭建 apt-get install jekyll ...
- wifi密码破解方法总结(含破解软件下载链接)
眼下网上流行有非常多无线password的破解方法,总结起来最有用的还是这两种:第一种是Wirelessnetview+WinAirCrackPack软件组合,这个方法简单方便:另外一种就是大家熟悉的 ...