相关疑难解决方法(0)

在C++中通过引用传递std algos谓词

我试图从a 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;
    }
  };
Run Code Online (Sandbox Code Playgroud)

以下是算法的代码:

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

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

c++ algorithm predicate std pass-by-reference

9
推荐指数
1
解决办法
1183
查看次数

我不能做一个简单的仿函数来比较字符串

我有这个仿函数类:

#include <string>

using namespace std;

class IsPlayerOfType
{
    public:
        IsPlayerOfType(const string& type) : type_(type) {}

        bool operator()(const Player* player) const
        {
            return (player->getType() == type_);
        }
    private:
        string type_;
};
Run Code Online (Sandbox Code Playgroud)

"Player"类表示具有多种方法和属性的玩家.其中,有getType()方法返回一个字符串.

在我的程序的某些时候,我有一个名为players_type 的变量vector<Player*>

最后,我有以下代码来计算我的向量中某种类型的玩家数量:

int number = count_if(players_.begin(), players_.end(), IsPlayerOfType("Defensive"));
Run Code Online (Sandbox Code Playgroud)

编译时我遇到很多错误,例如:

  • 错误C2011:'IsPlayerOfType':'class'类型重定义
  • 错误C2440:'':无法从'const char [10]'转换为'IsPlayerOfType'
  • 错误C2780:'iterator_traits <_Iter> :: difference_type std :: count_if(_InIt,_InIt,_Pr)':需要3个参数 - 提供2个参数

    我不太了解count_if是如何工作的,我试着写这段代码从这个答案中激励自己:https://stackoverflow.com/a/13525420

    我没有看到我错在哪里,编译器错误让我感到困惑.

c++ std functor

-1
推荐指数
1
解决办法
89
查看次数

标签 统计

c++ ×2

std ×2

algorithm ×1

functor ×1

pass-by-reference ×1

predicate ×1