我最近问了一个关于从矢量中删除项目的问题。好吧,我得到的解决方案有效,但我不明白 - 我找不到任何解释它的文档。
struct RemoveBlockedHost {
RemoveBlockedHost(const std::string& s): blockedHost(s) {}
// right here, I can find no documentation on overloading the () operator
bool operator () (HostEntry& entry) {
return entry.getHost() == blockedHost || entry.getHost() == "www." + blockedHost;
}
const std::string& blockedHost;
};
用作:
hosts.erase(std::remove_if(hosts.begin(), hosts.end(), RemoveBlockedHost(blockedhost)), hosts.end());
我查看了std :: remove_if的文档,它说只有在类重载()运算符时才可以传递类而不是函数。没有任何信息。
有谁知道链接到:
对此的帮助将不胜感激。我不喜欢在我的软件中添加代码,除非我理解它。我知道它有效,而且我(稍微)熟悉运算符重载,但我不知道()运算符是什么。
答案 0 :(得分:11)
答案 1 :(得分:2)
这是一个功能,实际上是一个算子。但常见问题解答解释了这一切:
功能块是功能 类固醇。功能是严格的 功能比功能更强大 额外的力量解决了一些(不是全部)的 通常面临的挑战 你使用函数指针。
https://isocpp.org/wiki/faq/pointers-to-members#functionoids
答案 2 :(得分:1)
尝试阅读有关Functors
的更多信息重载Function运算符()的类称为Functor。有关STL解释的任何体面的C ++书都会有关于它的信息
Here是您可以参考的链接。
答案 3 :(得分:0)
我想指出在C ++ 11之后,你可以避免使用lambda这样的东西:
hosts.erase(std::remove_if(hosts.begin(), hosts.end(),
[&blockedhost](HostEntry& entry) -> bool {
return entry.getHost() == blockedHost || entry.getHost() == "www." + blockedHost;
}), hosts.end());