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模板实现的主要内容,如果未能解决你的问题,请参考以下文章

c++ split()实现

C++:模板实现(代码风格)

C#常用代码片段备忘

c++分割字符串split方法实现

c++分割字符串split方法实现

VSCode自定义代码片段——.vue文件的模板