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

内部使用它map来放置和查找条目。否则,find将不得不将您提供的密钥与几乎所有其他条目逐一进行比较,并且您无法按密钥顺序迭代映射。

基本上,maps 有效地按顺序存储元素。为此,他们必须有某种方法知道订单什么,并且他们通过调用来做到这一点operator<(除非您另有说明)。

于 2013-10-08T00:02:43.637 回答
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"           }
};
于 2013-10-08T00:10:50.590 回答