template<class _Ty>
std::vector<_Ty> split(const std::string& str, const std::string& delim)
{
std::vector<_Ty> ret;
size_t off = 0;
std::string::size_type index = str.find_first_of(delim, off);
while (index != std::string::npos)
{
std::istringstream iss(str.substr(off, index - off));
std::copy(std::istream_iterator<_Ty>(iss), std::istream_iterator<_Ty>(), std::back_inserter(ret));
off = index + 1;
index = str.find_first_of(delim, off);
}
if (index - off > 0)
{
std::istringstream iss(str.substr(off, index - off));
std::copy(std::istream_iterator<_Ty>(iss), std::istream_iterator<_Ty>(), std::back_inserter(ret));
}
return std::move(ret);
}
为了兼容老的接口做的模板化split
没有用c++11的把最后std::move换掉就好,更好在参数里面加ret,减少一次拷贝
这里有一个bug,如果str里面有空格 比如 split("aa bb,cc dd", ","),ret实际拿到的值只有{aa, cc}
尝试了std::noskipws这种方式无法解决,暂时没有解决这个问题