2016-03-18 21 views
-5

我試圖找到一個對象出現在一個std :: multimap中計數出現的對象ID的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; 

最初,我想用運算符==來計算出現次數,但它是與運算符<一起計算的。使用函數countOccurrences()是我的解決方案。

+5

[您需要創建一個最小,完整和可驗證的示例。](http://stackoverflow.com/help/mcve) – Xirema

+1

首先,我們不知道'S'是什麼。 –

+4

地圖中的按鍵必須是唯一的。關鍵要麼存在要麼只有一個。如果你想看看是否存在一個鍵,然後使用['std :: map :: find()'](http://en.cppreference.com/w/cpp/container/map/find) – NathanOliver

回答

4

不過,這並不工程,IL只返回1和有我的地圖至少2個 對象具有相同的id

這是一個std::map。您不能擁有兩個具有相同密鑰的對象,並且我假設您試圖使用O所提交的m_id作爲您的密鑰。請嘗試使用std::multimap

而且,計算項目的數量,使用map::count()(其中性病::地圖只能返回一個或零!)

+1

...並考慮使用'map :: find(T)' – user16

+0

「你不能有兩個具有相同ID的對象。」其實這並不完全正確。你認爲'id'被用作'std :: map'的關鍵字,但沒有在代碼中顯示。 – Slava

+0

@Slava,根據顯示的代碼可能是最簡單的假設:) – Roddy

0

由於採用了這樣std::map,你只需要爲每個鍵一個值。如果你爲一個鍵插入了不同的值,那麼你有覆蓋以前的與新的。

正如在評論中指出的那樣,避免std::map有自己的優化版本的std算法。例如std::count_ifstd::find_if而不是std::map雖然。

+1

不要在'map'或'multimap'上使用算法,它們比使用成員函數 - O(n)和O(log n)效率低。 –

+0

「如果你爲一個鍵插入了不同的值,那麼你用新的值覆蓋了以前的值。」如果它們是通過'std :: map :: insert'插入的,它們不會被覆蓋 – Slava

+0

@mark - 感謝您的更正,我更改了這一部分以更好地反映這一點。 –