我试图在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()是我的解决方案。
答案 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_if
和std::map
中的{{1}}和<{1}}中的不是。