【问题标题】:Proper implementation of removing vector elements移除向量元素的正确实现
【发布时间】:2013-07-14 05:39:59
【问题描述】:

所有,

这是this线程的延续。

我尝试的是编写以下代码:

struct Remover : public std::binary_function<CPlayer,void,bool>
{
public:
    bool operator()(const CPlayer &player) const
    {
        return player.IsNewPlayer();
    }
};

这样称呼它:

players_pool->erase( std::remove_if( players_pool->begin(), players_pool->end(), std::bind2nd( Remover() ) ) );

但它给了我一个错误:

std::bind2nd():需要 2 个参数 - 提供 1 个。

如何正确调用这个函子?

谢谢。

【问题讨论】:

  • 您了解错误信息吗? expects 2 arguments - 1 provided. - 另外,您阅读过std::bind2nd() 的文档吗?
  • 您既不需要bind2nd,也不需要Remover。看std::mem_fun
  • @n.m.请注意,std::mem_fun 已弃用。但std::mem_fn 可能是另一种选择。
  • @juanchopanza 是的,如果您使用的是 C++11,那就对了。

标签: c++ algorithm stl


【解决方案1】:

您无需将Remover() 包装在std::bind2nd() 中。

此外,您不需要从 std::binary_function&lt;&gt; 派生(无论如何这是错误的;Remover 是一元函子)。事实上,你不需要从任何东西中派生。

最后,如果您的编译器支持 C++11,您可以将代码缩减为:

players_pool->erase( std::remove_if( begin(*players_pool), end(*players_pool),
                                     [](const CPlayer &player) {
                                         return player.IsNewPlayer();
                                     } ),
                     end(*players_pool) );

【讨论】:

    【解决方案2】:

    只需将您的 binary_function 更改为 unary_function。
    您还需要将结束迭代器添加到擦除调用中,以擦除所有已删除的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-18
      • 1970-01-01
      • 2014-05-06
      • 2012-01-15
      • 2012-08-08
      • 2016-09-01
      • 2021-10-12
      • 2011-03-03
      相关资源
      最近更新 更多