计算地图中相同值的数量

cal*_*pto 7 c++ map count

是否有任何命令可以计算地图中相同值的数量?

喜欢:

map<int, string> m;
m[1] = "A";
m[22] = "A";
m[53] = "C";
m[12] = "A";
m[6] = "A";

int count = m.count("A");// 4
Run Code Online (Sandbox Code Playgroud)

或者我应该自己写一下,因为它不太难?

Jam*_*lis 14

您可以将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_;
};
Run Code Online (Sandbox Code Playgroud)

用法:

typedef std::map<int, std::string> Map;
typedef Map::value_type MapEntry;
std::count_if(m.begin(), m.end(), second_equal_to<MapEntry>("A"));
Run Code Online (Sandbox Code Playgroud)

或者,对于更通用的解决方案,您可以编写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);
}
Run Code Online (Sandbox Code Playgroud)

用法:

std::count_if(m.begin(), m.end(), 
    apply_to_second<MapEntry>(std::bind2nd(std::equal_to<std::string>(), "A")));
Run Code Online (Sandbox Code Playgroud)

如果你有一个支持lambda表达式的编译器,你根本就不需要任何自定义谓词函子; 你可以使用一个更简单的lambda:

std::count_if(m.begin(), m.end(), [](const MapEntry& e) { 
    return e.second == "A";
});
Run Code Online (Sandbox Code Playgroud)


Rob*_*obᵩ 6

您可以使用std::count自定义值参数:

struct Compare {
    std::string str;
    Compare(const std::string& str) : str(str) {}
};
bool operator==(const std::pair<int, std::string>&p, const Compare& c) {
    return c.str == p.second;
}
bool operator==(const Compare& c, const std::pair<int, std::string>&p) {
    return c.str == p.second;
}


int  main() {
    std::map<int, std::string> m;
    m[1] = "A";
    m[22] = "A";
    m[53] = "C";
    m[12] = "A";
    m[6] = "A";

    int count = std::count(m.begin(), m.end(), Compare("A"));

    std::cout << count << "\n";
}
Run Code Online (Sandbox Code Playgroud)