2016-08-01 40 views
0

什麼是在下面的程序的問題,爲什麼我不能夠以班級爲重點我怎樣才能插入關鍵在地圖STL在C++類

#include <iostream> 
#include <map> 

#include <utility> 

using namespace std; 

class User 
{ 
    int value_1; 
    int value_2; 
public: 
    User(int num_1, int num_2) 
    { 
     value_1 = num_1; 
     value_2 = num_2; 
    } 
    int getId(){ 
     return value_1; 
    } 
    int getUid(){ 
     return value_2; 
    } 
    bool operator< (const User& userObj) const 
    { 
     if(userObj.value_1 < this->value_1) 
      return true; 
    } 
}; 

int main() 
{ 
    std::map<User, int> m_UserInfoMap; 

    m_UserInfoMap.insert(std::make_pair<User, int>(User(1,2), 100)); 
    m_UserInfoMap.insert(std::make_pair<User, int>(User(3,4), 120)); 
    m_UserInfoMap.insert(std::make_pair<User, int>(User(5,6), 300)); 
    std::map<User, int>::iterator it = m_UserInfoMap.begin(); 
    for(; it != m_UserInfoMap.end(); it++) 
    { 
     std::cout<<it->first.getId()<<" :: "<<it->second<<std::endl; 
    } 
    return 0; 
} 

初始化地圖在上面的程序,如果我嘗試將密鑰添加爲錯誤的類。 請告訴不同的方式來初始化地圖。

+0

如果我嘗試初始化地圖像: m_UserInfoMap [a] = 1;它工作正常」 但如果 的std ::地圖 m_UserInfoMap =(A,1);或 的std ::地圖 m_UserInfoMap(A,1); 它不工作,所以什麼與以上陳述撥錯 –

+0

?我們不打算再次編譯你的編譯器的工作*。發佈錯誤 – nvoigt

+1

提高你的警告級別你有一個微不足道的錯誤:一個非void函數*總是*必須返回一些東西 – juanchopanza

回答

5

std::mapvalue_typestd::pair<const Key, T>,表示密鑰保存爲const。所以你不能調用它們的非const成員函數,如std::cout<<it->first.getId()

您應該將User::getId()(和User::getUid())更改爲const成員函數。如:

int getId() const { 
//   ~~~~~ 
    return value_1; 
} 
int getUid() const { 
//   ~~~~~ 
    return value_2; 
} 

BTW:當if條件operator<失敗,你沒有任何回報。

bool operator< (const User& userObj) const 
{ 
    if(userObj.value_1 < this->value_1) 
     return true; 
    else 
     return false; // return for else case 
} 

或只是

bool operator< (const User& userObj) const 
{ 
    return userObj.value_1 < this->value_1; 
} 
+1

'if(condition)return true;否則返回false;'是不好的風格,最好不要顯示這樣的東西... – Aconcagua

+1

@Aconcagua我同意。我想要強化OP也應該返回隱含的其他情況。無論如何,我最後寫了最簡單的一本。 :) – songyuanyao

1

首先,你應該讓你的操作總是返回一個值:

bool operator< (const User& userObj) const 
{ 
    return userObj.value_1 < this->value_1; 
} 

你確定你真的要比較x < yy.value < x.value?否則,你需要改變的比較中:

bool operator< (const User& userObj) const 
{ 
    return this->value_1 < userObj.value_1; 
} 

而且在寫這個答案,songyuanyao已經比我更快的第二部分,所以看看他的回答......