我正试着做这样的东西:
v.erase(remove_if(v.begin(), v.end(), !pointer_to_func), v.end());
其中v是字符串的vector
,pointer_to_func
是我的function-pointer
,看起来像这样:
bool (*pointer_to_func)(std::string);
我知道!pointer_to_func是错误的,然而,这是我希望在给定的情况下以某种方式生成的算法。
这是它在类中的声明方式:
void Place::filter_ss(bool (*n)(std::string)){}; //function pointer labeled FP
我已经找遍了所有的地方,我不知道还能做什么。考虑到函数调用过滤向量中的单词以满足子字符串条件,我认为remove_if()和copy()mash-up可以完成这个任务,但是我错了,我看到的所有选项都被弃用/删除了(即not1
、not2
、ptr_fun
等)。
函数在主程序文件中调用如下:
int main(){
//places all push_back into vector v
Place p(){"Observatory", "Airport", "Delicatessen", "Theater", "Vacation"};
//this function is the pain, it take in the string directly and erases words not containing the substring
p.filter_ss(at);
//for loop should output: Observatory Delicatessen Theater Vacation
for (size_t x = 0; x < p.v.size(), x++)
cout << v[x] << " ";
... //Do something
... //Do something more
return 0;
}
型
我的代码只适用于预定义的测试函数,例如:
bool st(string str){
return str.find("st") < string::npos;
}
如有任何帮助/指示,我们将不胜感激。
尝试并不是按顺序进行的,也不是只有它们才有自己独特的可能性。以下是我所尝试的一些事情的一般想法:**一、
void Place::filter_ss(bool (*n)(string)){
pointer_to_func = n;
vector<string> temp;
for(size_t t = 0; t < v.size(); t++){
if(pointer_to_func(v[t])){
temp.push_back(v[t]);
}
}
v.clear();
for(auto s : temp)
v.push_back(s);
}
二、
void Place::filter_ss(bool (*n)(string)){
pointer_to_func = n;
v.erase(remove_if(v.begin(), v.end(), not1(ptr_fun(pointer_to_func))), v.end());
}
三、
void Place::filter_ss(bool (*n)(string)){
vector<string> temp;
pointer_to_func = n;
copy_if(temp.begin(), temp.end(), back_inserter(v), pointer_to_func);
}
1条答案
按热度按时间ie3xauqp1#
各种
std::not
函数在C17中已弃用,并从C20中删除,因为它们added a better, generic alternative:std::not_fn
: