我试图从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)
不幸的是,断言是错误的,因为谓词是按值传递的.有没有办法强制它通过引用传递?
我有这个仿函数类:
#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)
编译时我遇到很多错误,例如:
错误C2780:'iterator_traits <_Iter> :: difference_type std :: count_if(_InIt,_InIt,_Pr)':需要3个参数 - 提供2个参数
我不太了解count_if是如何工作的,我试着写这段代码从这个答案中激励自己:https://stackoverflow.com/a/13525420
我没有看到我错在哪里,编译器错误让我感到困惑.