1、此方法与 .NET Framework 提供得字符串切割算法效果不同,它是以明确的 “分割符字符串” 对字符串进行分割。
int Split(const std::string& str, std::vector<std::string>& tokens, const std::string& delimiters) {
if (str.empty()) {
return 0;
}
else if (delimiters.empty()) {
tokens.push_back(str);
return 1;
}
size_t last_pos = 0;
size_t curr_cnt = 0;
while (true) {
size_t pos = str.find(delimiters, last_pos);
if (pos == std::string::npos) {
pos = str.size();
}
size_t len = pos - last_pos;
if (len != 0) {
curr_cnt++;
tokens.push_back(str.substr(last_pos, len));
}
if (pos == str.size()) {
break;
}
last_pos = pos + delimiters.size();
}
return curr_cnt;
}
2、对满足 “分割字符串任意字符” 进行分割,这才是 .NET Framework 相类似得字符串分割实现,但其效率会低于 “按分割字符串” 进行分割,但好用才是王道,如果严重容不下沙子,那别用分割字符串的代码实现了,每个想要分割时单独写,带上寄存器+内联汇编做极致得优化。
int Tokenize(const std::string& str, std::vector<std::string>& tokens, const std::string& delimiters) {
if (str.empty()) {
return 0;
}
else if (delimiters.empty()) {
tokens.push_back(str);
return 1;
}
char* deli_ptr = (char*)delimiters.data();
char* deli_endptr = deli_ptr + delimiters.size();
char* data_ptr = (char*)str.data();
char* data_endptr = data_ptr + str.size();
char* last_ptr = NULL;
int length = 0;
int seg = 0;
while (data_ptr < data_endptr) {
int ch = *data_ptr;
int b = 0;
for (char* p = deli_ptr; p < deli_endptr; p++) {
if (*p == ch) {
b = 1;
break;
}
}
if (b) {
if (seg) {
int sz = data_ptr - last_ptr;
if (sz > 0) {
length++;
tokens.push_back(std::string(last_ptr, sz));
}
seg = 0;
}
}
else if (!seg) {
seg = 1;
last_ptr = data_ptr;
}
data_ptr++;
}
if ((seg && last_ptr) && last_ptr < data_ptr) {
length++;
tokens.push_back(std::string(last_ptr, data_ptr - last_ptr));
}
return length;
}
版权声明:本文为liulilittle原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。