我正在尝试从 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;
}
};
这是算法的代码:
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>
and 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));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)