你可以使用具有自定义谓词函数对象的count_if
算法:
template <typename Pair>
struct second_equal_to
: std::unary_function<const Pair&, bool>
{
second_equal_to(const typename Pair::second_type& value)
: value_(value) { }
bool operator()(const Pair& p) const
{
return p.second == *value_;
}
private:
typename Pair::second_type value_;
};
使用方法:
typedef std::map<int, std::string> Map;
typedef Map::value_type MapEntry;
std::count_if(m.begin(), m.end(), second_equal_to<MapEntry>("A"));
或者,为了得到更通用的解决方案,你可以编写一个apply_to_second
谓词变换器:
template <typename Pair, typename Predicate>
struct apply_to_second_f
: std::unary_function<const Pair&, bool>
{
apply_to_second_f(const Predicate& p)
: predicate_(p) { }
bool operator()(const Pair& p) const
{
return predicate_(p.second);
}
Predicate predicate_;
};
template <typename Pair, typename Predicate>
apply_to_second_f<Pair, Predicate> apply_to_second(const Predicate& p)
{
return apply_to_second_f<Pair, Predicate>(p);
}
用法:
std::count_if(m.begin(), m.end(),
apply_to_second<MapEntry>(std::bind2nd(std::equal_to<std::string>(), "A")));
如果您有支持lambda表达式的编译器,则根本不需要任何自定义谓词函数对象;您可以使用更简单的lambda:
std::count_if(m.begin(), m.end(), [](const MapEntry& e) {
return e.second == "A";
});
std::map<string, int>
,用于计算每个.second
的频率。 - user418748