• 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 != '' )
        {
            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;
    }
    

    
  • 相关阅读:
    初始化webpack项目
    GCN 实现3 :代码解析
    GCN实现3
    GCN 简单numpy实现
    GCN python 实现2:利用GCN进行节点分类
    GCN
    Transformer —— attention is all you need
    多任务学习Multi-task-learning MTL
    两个概念:CCA和LDA
    Transfer learning
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5202733.html
Copyright © 2020-2023  润新知