16

我最近问了一个关于从向量中删除项目的问题。好吧,我得到的解决方案有效,但我不明白 - 我找不到任何解释它的文档。

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 的文档,它说只有当类重载 () 运算符时才能传递类而不是函数。什么信息都没有。

有谁知道以下链接:

    • 一本包含示例/解释的书
      或者,在线文档/教程的链接

  • 对此的帮助将不胜感激。我不喜欢在我的软件中添加代码,除非我理解它。我知道它有效,并且我(有点)熟悉运算符重载,但我不知道 () 运算符的用途。

    4

    4 回答 4

    14

    它在 C++ 中被称为函子

    这个答案有一个很好的例子等

    C++ 函子 - 及其用途

    于 2011-03-31T16:58:41.447 回答
    3

    它是一个函数,实际上是一个函子。但常见问题解答说明了一切:

    Functionoids 是类固醇上的函数。Functionoid 严格来说比函数更强大,而这种额外的能力解决了您在使用函数指针时通常面临的一些(不是全部)挑战。

    https://isocpp.org/wiki/faq/pointers-to-members#functionoids

    于 2011-03-31T16:59:33.327 回答
    1

    尝试阅读更多关于Functors重载 Function operator() 的类称为 Functor。任何对 STL 进行解释的体面的 C++ 书籍都会提供有关它的信息。
    是您可以参考的链接。

    于 2011-03-31T16:58:17.353 回答
    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());
    
    于 2016-06-22T16:28:53.767 回答