c++ split模板实现
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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模板实现的主要内容,如果未能解决你的问题,请参考以下文章