【发布时间】:2022-11-15 19:18:46
【问题描述】:
我想要一个按分隔符数组拆分文本的函数。我有一个完美运行的演示,但它真的很慢。这是参数的示例。
文本:
“pop-pap-bab 鲍勃”
分隔符向量:
“-”,“”
结果:
“pop”、“-”、“pap”、“-”、“bab”、“bob”
因此,函数循环抛出字符串并尝试查找分隔符,如果找到分隔符,则将找到的文本和分隔符推送到结果数组,如果文本仅包含空格或为空,则不推送文本.
std::string replace(std::string str,std::string old,std::string new_str){
size_t pos = 0;
while ((pos = str.find(old)) != std::string::npos) {
str.replace(pos, old.length(), new_str);
}
return str;
}
std::vector<std::string> split_with_delimeter(std::string str,std::vector<std::string> delimeters){
std::vector<std::string> result;
std::string token;
int flag = 0;
for(int i=0;i<(int)str.size();i++){
for(int j=0;j<(int)delimeters.size();j++){
if(str.substr(i,delimeters.at(j).size()) == delimeters.at(j)){
if(token != ""){
result.push_back(token);
token = "";
}
if(replace(delimeters.at(j)," ","") != ""){
result.push_back(delimeters.at(j));
}
i += delimeters.at(j).size()-1;
flag = 1;
break;
}
}
if(flag == 0){token += str.at(i);}
flag = 0;
}
if(token != ""){
result.push_back(token);
}
return result;
}
我的问题是,函数真的很慢,因为它有 3 个循环。我想知道是否有人知道如何使该功能更快。对不起,如果我不够清楚,我的英语不是最好的。
【问题讨论】:
-
std::find_first_of。它不会自动更快,但可能会使您的代码更简单。你真的需要std::string分隔符吗?在您的示例中,它们都是单个字符 -
“真的很慢”有多慢?对于您的示例输入,即使是更高效的算法,我也不希望有太大差异
-
@463035818_is_not_a_number 它必须是字符串,因为在我的情况下有超过一个字符,有时它是 5 个或更多。当你有超过 100,000 个字符需要遍历时,它需要一分钟以上的时间来遍历
-
不确定我是否理解你的代码。当您可以简单地调用
std::string::find时,您似乎构造了子字符串以将它们与定界符进行比较。仅此一项就可能会导致加速,因为构造子字符串的成本很高。尽管在尝试手动优化之前,您是否打开了编译器优化? -
@463035818_is_not_a_number 我不确定你所说的“打开编译器优化”是什么意思,我也不确定如何在函数中实现 std::string::find,请你帮我解决这个问题。我真的是编程新手
标签: c++