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;
}

この例では、演算子「<」がどこで使用されているかよくわかりません。演算子「<」の定義をコメントアウトすると、多くのエラーが発生します。

4

2 に答える 2

5

std::mapマップ内の要素を比較する方法を指定するパラメーターがあります (マップは常にキー順に並べ替えられた内容を維持するため必要です)。デフォルトでは、それはstd::less<T>.

std::less<T>は、 を使用して比較を行いoperator<ます。

定義されていないアイテムのマップを作成できますが、そのためには比較関数/ファンクターを明示的に指定する必要があります。operator<

とは言っても、あなたItemDataとあなたは両方とも、すでにできることItemObjを実際に行っているだけです。std::string上記のコードのほとんどを次のように減らすことができます。

std::map<std::string, std::string> items{
    { "potion", "heal HP"       },
    { "key", "unlock a door"    },
    { "lamp", "light"           }
};
于 2013-10-08T00:10:50.590 に答える
5

mapこれは、エントリを配置および検索するために によって内部的に使用されます。そうしfindないと、指定したキーを文字通り他のすべてのエントリと 1 つずつ比較する必要があり、キーの順序でマップを反復処理できませんでした。

基本的に、maps は要素を順番に効率的に格納します。それを行うには、順序が何であるかを知る何らかの方法が必要であり、呼び出しによってそれを行いoperator<ます (特に指定しない限り)。

于 2013-10-08T00:02:43.637 に答える