c++ split模板实现
2016-02-20 09:53
260 查看
模板实现,重载+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++ vector用法
- 值得推荐的C/C++框架和库
- C/C++ 函数所在的头文件(二)
- C++之路进阶——队列优化dp(玩具装箱)
- LeanCloud C++ SDK安装测试记录
- C++之路进阶——线段树(上帝造题的七分钟 2)
- C++之路进阶——状态压缩dp(互不侵犯)
- C++之路进阶——ST表(降雨量)
- C++之路进阶——四边不等式优化dp(诗人小G)
- word2vec中文相似词计算和聚类的使用说明及c语言源码
- c语言中的正则
- 【C++学习与应用总结】12: Unscoped Enum
- C语言杂谈:指针与数组 (上)
- c++STl的全排列
- C++之 浅拷贝和深拷贝
- neuq oj 1043: 谭浩强C语言(第三版)习题5.7 C语言
- 关于C语言include尖括号和双引号的对话
- C语言:【动态顺序表】动态顺序表的在指定位置插入元素Insert,以及指定元素Find
- 单件模式
- 74. Search a 2D Matrix