2014-11-15 34 views
0

當我使用operator []在C++ map中插入元素時,會發生錯誤。運算符[]和insert()函數不應該在C++映射中表現相同的方式嗎?

我有這張地圖< Pair,int> variable。當我向其中插入一個新元素,然後使用迭代器打印其鍵時,地圖的某些元素會隨機消失,並且值不會按遞增順序打印。但是,當我使用funtion insert()插入元素時,一切正常。我在做運營商[]做錯了什麼?兩種情況下的結果都不應該相同嗎?

備註:每個鍵對都是一個存儲一對整數的結構。

這是一個例子: 我插入了六個以下的鍵(5,9),(5,11),(5,12),(4,14),(1,10),(3,10 )。 然後,我遍歷地圖和密鑰(3,10)消失。此外,元素不按順序打印。 要查看他們應該打印的正確方式,請按照下面代碼註釋中給出的說明進行操作。

這裏是我的代碼:

#include <iostream> 
#include <map> 

using namespace std; 

struct Pair { 
    int a; 
    int b; 

    Pair(const int& a,const int& b) { //assures the first int is the smaller one 
     if (a < b) { 
      this->a = a; 
      this->b = b; 
     } else { 
      this->b = a; 
      this->a = b; 
     } 
    } 

    bool operator<(const Pair& otherPair) const { 
     return this->a < otherPair.a || this->b < otherPair.b; 
    } 
}; 

int main() { 
    Pair elements []{ Pair (5,9), Pair (5,11), Pair (5,12), Pair (4,14), Pair (1,10), Pair (3,10) }; // keys to insert into the map 

    map<Pair,int> mapPairInt; // map to store the elements 

    for(int i = 0; i <6;i++){ 
     mapPairInt[elements[i]] = 0; //insert elements using operator[] 
     //mapPairInt.insert (std::pair<Pair,int>(elements[i],0)); // insert elements using insert() -- uncomment this line and comment the line above. This will make everything works properly 
} 

    //print the keys stored by the map (the keys should be printed in increasing order) 
    map<Pair,int>::iterator it = mapPairInt.begin(); 
    while(it != mapPairInt.end()){ 
     cout<< it->first.a << "-" << it->first.b <<endl; 
     it++; 
    } 

    return 0; 
} 

回答

5

Pair::operator<()違反std::map,即傳遞性要求。例如,(5,12) < (4,14)但在同一時間(4,14) < (5,12)。這必須暗示(5,12) < (5,12)這是錯誤的(即使它是真的,它會違反另一個要求,無反射性)。

這種違規行爲會導致未定義的行爲,所以會發生任何事情。

BTW寫在我的面前正確的比較操作的最簡潔的方式是

bool operator< (const Pair& otherPair) const { 
    return std::tie(a, b) < std::tie(otherPair.a, otherPair.b); 
} 
0
bool operator<(const Pair& otherPair) const { 
    if (this->a == otherPair.a) 
    { 
     return this->b < otherPair.b; 
    } 
    return this->a < otherPair.a; 
} 

是您的比較應該是什麼樣子。它產生你期望的結果。

相關問題