几种c++字符串split 函数实现的比较
文中的字符串split函数功能是 从字符串中按照特定的分隔符进行分割,分割的结果保存到std::vector中。
1. strtok实现
std::vector<std::string> split(const char *s, const char *delim)
{
std::vector<std::string> result;
if (s && strlen(s))
{
int len = strlen(s);
char *src = new char[len + 1];
strcpy(src, s);
src[len] = '\0';
char *tokenptr = strtok(src, delim);
while (tokenptr != NULL)
{
std::string tk = tokenptr;
result.emplace_back(tk);
tokenptr = strtok(NULL, delim);
}
delete[] src;
}
return result;
}
2. 优化版的字符串查找方式实现
void supersplit(const std::string& s, std::vector<std::string>& v, const std::string& c)
{
std::string::size_type pos1, pos2;
size_t len = s.length();
pos2 = s.find(c);
pos1 = 0;
while(std::string::npos != pos2)
{
v.emplace_back(s.substr(pos1, pos2-pos1));
pos1 = pos2 + c.size();
pos2 = s.find(c, pos1);
}
if(pos1 != len)
v.emplace_back(s.substr(pos1));
}
3. 正则表达式方式
std::vector<std::string> regexsplit(const std::string& input)
{
std::regex re(",");
std::sregex_token_iterator p(input.begin(), input.end(), re, -1);
std::sregex_token_iterator end;
std::vector<std::string> vec;
while (p != end)
vec.emplace_back(*p++);
return vec;
}
4. 使用boost split 实现
std::vector<std::string> boostsplit(const std::string& input)
{
std::vector <std::string> fields;
boost::split( fields, input, boost::is_any_of( "," ) );
return fields;
}
5. sds sdssplitlen 函数实现
void sdssplit(const std::string& input, std::vector<std::string>& v)
{
int len = 0;
sds* array = sdssplitlen(input.c_str(),input.length(),",",1,&len);
for(int i=0;i<len;i++)
v.emplace_back(array[i]);
}
以上函数用Celero库测试的结果如下: