2013-10-08 46 views
2

我試過使用「map」的STL示例程序。本示例中使用的運算符「<」在哪裏?

http://ideone.com/LB8xvh

#include <iostream> 
#include <map> 
#include <cstring> 
using namespace std; 

class ItemName 
{ 
    char name[80]; 
public: 
    ItemName(char *s) { strcpy(name, s); } 
    char *get() { return name; } 
}; 

bool operator<(ItemName a, ItemName b) 
{ 
    return strcmp(a.get(), b.get()) < 0; 
} 

class ItemObj 
{ 
    char str[80]; 
public: 
    ItemObj(char *s) { strcpy(str, s); } 
    char *get() { return str; } 
}; 

char itemdata[][80] = { 
    "potion", "heal HP", 
    "key", "unlock a door", 
    "lamp", "light", 
}; 


int main() { 
    map<ItemName, ItemObj> items; 

    for(int i=0; i<3; i++) { 
     items.insert(
       pair<ItemName, ItemObj>(
        ItemName(itemdata[i*2]), 
        ItemObj(itemdata[i*2+1]))); // ***** pair ***** 

    } 

    map<ItemName, ItemObj>::iterator p; 

    char str[80]; 
    const int kMaxLoop = 5; 
    int nLoop = 0; 
    while(nLoop < kMaxLoop) { 
     cout << "> "; 
     cin >> str; 
     p = items.find(str); 
     if(p != items.end()) { 
      cout << p->second.get() << endl; 
     } else { 
      cout << "unknown item." << endl; 
     } 
     nLoop++; 
    } 

    return 0; 
} 

在這個例子中,我不太清楚哪裏算 「<」 一詞。 如果我註釋掉運算符「<」的定義,則會收到很多錯誤。

+2

讓您輕鬆自如並使用'std :: string'。 C字符串只是額外的工作,這裏沒有任何好處。 – chris

+0

謝謝你的建議。我會牢記這一點。 – sevenOfNine

回答

5

std::map有一個參數來指定如何比較地圖中的元素(因爲地圖始終保持其內容按鍵順序排序,所以需要)。默認情況下,這是std::less<T>

std::less<T>,反過來,將使用operator<進行比較。

可以創建未定義operator<的項目的映射,但要做到這一點,您需要明確指定比較函數/函子。

這就是說:你的ItemDataItemObj都只是做std::string已經可以做的事情。您可以將上面的大部分代碼縮減爲如下所示:

std::map<std::string, std::string> items{ 
    { "potion", "heal HP"  }, 
    { "key", "unlock a door" }, 
    { "lamp", "light"   } 
}; 
+0

非常感謝Jerry Coffin。我可以很好地理解它是如何工作的。另外,我很感激你向我展示了使用std :: string的替代方法。 – sevenOfNine

+0

它的工作!謝謝。 http://ideone.com/fSfdZK – sevenOfNine

5

它由map在內部用於放置和查找條目。否則,find必須將您提供的密鑰與字面上每個其他條目逐一進行比較,並且您無法按鍵順序迭代地圖。

基本上,map按順序有效地存儲元素。要做到這一點,他們必須有一些方法來知道的訂單是,他們通過調用operator<(除非另有說明)來做到這一點。

+0

這不完全正確。 ['std :: map'](http://en.cppreference.com/w/cpp/container/map)的第三個模板參數默認是'std :: less '使用'operator <',因此你可以創建一個'std :: map',它不會*需要'operator <'。 –

+0

@DanielFrey謝謝。更新。 –

+0

非常感謝David Schwartz和Daniel Frey。我看到地圖在內部使用運算符「<」。另外,我將學習std :: less 。 – sevenOfNine