c++ split模板实现
2023-09-14 09:07:58 时间
模板实现,重载+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++学习之路——名字空间与模板
- C++泛型编程,模板(一)函数模板
- C++ stl_stl函数
- C++ 炼气期之数组探幽
- EasyC++67,<< 运算符重载
- EasyC++88,类模板(一)
- C++求最大公约数和最小公倍数
- c++日志库实战——spdlog,是不是感觉log4cxx有点笨重,不妨试一试spdlog
- C++回炉之_C++PrimerPlus_第十四章 C++中的代码重用
- 2022ReSharper C++激活码(2022ReSharper C++最新激活码)2022ReSharper C++激活码
- C++STL-string类的使用
- 初识C++模板
- 【C++】模板进阶
- C++用类模板实现可变长数组
- C++模板类(类模板)与继承
- C++ setw:格式化输出(详解版)
- 用C++实现队列的程序代码
- 浅析C++中模板的那点事
- C++标准模板库函数sort的那些事儿
- C++求斐波那契数的实例代码