在std :: multimap

时间:2016-03-18 15:58:10

标签: c++ std multimap

我试图在std :: multimap

中找到对象的出现位置

这是我的目标点:

class Point
{
public:

    Point(string id, float x, float y, float z);

    string m_id;
    float m_x;
    float m_y;
    float m_z;

    //I want to count with this operator
    bool operator==(const Point &point) const
    {
        return point.m_id == m_id;
    }

    bool operator <( const Point &point ) const
    {
        return ( m_y < point.m_y );
    }

};

这是我的功能(解决方案):

int countOccurences(multimap<Point, string> multimap, Point point)
{
    int result = 0;

    for (auto it = multimap.begin(); it != multimap.end(); it++)
        if (it->first == point)
            result++;

    return result;
}

我的主要人物:

multimap<Point, string> places;

Point point1("point", 0, 0, 0 );
Point point2("cake", 0, 0, 0 );
Point point3("point", 0, 0, 0 );

places.insert(make_pair(point1, ""));
places.insert(make_pair(point2, ""));
places.insert(make_pair(point3, ""));

cout << "CORRECT = 2" << endl;
cout << "COUNT = " << places.count(point3) << endl;
cout << "MY_COUNT = " << countOccurences(places, point3) << endl;

最初,我想用运算符==来计算出现次数,但它是用运算符&lt;来计算的。使用函数countOccurrences()是我的解决方案。

2 个答案:

答案 0 :(得分:4)

  

但它不起作用,il只返回1而至少有2   我的地图中具有相同ID的对象

它是std::map。您不能拥有两个具有相同密钥的对象,并且我假设您尝试使用m_id O字段作为密钥。请尝试使用std::multimap

并且,要计算项目数,请使用map::count()(对于std :: map,只能返回一个或零!)

答案 1 :(得分:0)

由于您使用的是std::map,因此每个密钥只有一个值。如果您为一个密钥插入了不同的值,则覆盖之前的密钥

正如评论中所指出的,避免使用std std::map算法,std::count_if有自己的优化版本。 std::find_ifstd::map中的{{1}}和<{1}}中的不是