c++ 如何为矢量创建“remove_if_not”< string>

wf82jlnq  于 2022-12-15  发布在  其他
关注(0)|答案(1)|浏览(106)

我正试着做这样的东西:

v.erase(remove_if(v.begin(), v.end(), !pointer_to_func), v.end());

其中v是字符串的vectorpointer_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可以完成这个任务,但是我错了,我看到的所有选项都被弃用/删除了(即not1not2ptr_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);
}
ie3xauqp

ie3xauqp1#

各种std::not函数在C17中已弃用,并从C20中删除,因为它们added a better, generic alternative: std::not_fn

v.erase(remove_if(v.begin(), v.end(),
    std::not_fn(pointer_to_func), v.end());

相关问题