c++ - 在 C++ 中通过引用传递标准算法谓词

标签 c++ algorithm pass-by-reference std predicate

我正在尝试从 std::list 中删除元素并保留已删除元素的一些统计信息。

为此,我使用了列表中的 remove_if 函数,并且我有一个谓词。我想使用这个谓词来收集统计数据。这是谓词的代码:

  class TestPredicate
  {
  private:
    int limit_;

  public:
    int sum;
    int count;
    TestPredicate(int limit) : limit_(limit), sum(0), count(0) {}

    bool operator() (int value) 
    {
      if (value >= limit_)
      {
        sum += value;
        ++count;       // Part where I gather the stats
        return true;
      }
      else
        return false;
    }
  };

这是算法的代码:

std::list < int > container;
container.push_back(11);
TestPredicate pred(10);
container.remove_if(pred)
assert(pred.count == 1);

不幸的是,断言是假的,因为谓词是按值传递的。有没有办法强制它通过引用传递?

最佳答案

传递引用包装器,可从 <functional> 获得:

container.remove_if(std::ref(pred));

如果你只有 C++98/03 但你的编译器有 TR1,你可以使用 <tr1/functional>std::tr1::ref如果你对你的谓词做一个小的修改:

#include <tr1/functional>

class TestPredicate : public std::unary_function<int, bool>
{                 //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  // ...
}

container.remove_if(std::tr1::ref(pred));

如果所有其他方法都失败了,那么您可以相对轻松地破解手动解决方案:

struct predref
{
  TestPredicate & p;
  bool operator()(int n) { return p(n); }
  predref(TestPredicate & r) : p(r) { }
};

container.remove_if(predref(pred));

关于c++ - 在 C++ 中通过引用传递标准算法谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8313370/

相关文章:

c++ - 在 Linux 中链接 SFML 音频?

c++ - 遍历 STL 列表

c++ - Haar 检测 - 保存图像的 Mat 以获取和显示前一帧

algorithm - 排序算法如何具有 O(1) 的空间复杂度?

algorithm - 以下斐波那契数列程序的时间复杂度是多少?代码使用动态规划

c# - 将 C# 7.2 'in' 参数修饰符放在各处是否有用

c - C 中的输出参数

c++ - 检查 std::shared_ptr 中的空值

java - Java中整数乘法的渐近复杂度是多少

java - 按值传递 - 树未删除