运营商在哪里“<”在这个样本中使用?

时间:2013-10-08 00:01:42

标签: c++ stl

我使用“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;
}

在这个例子中,我不太确定运营商“&lt;”在哪里用来。 如果我注释掉运算符“&lt;”的定义,我会收到很多错误。

2 个答案:

答案 0 :(得分:5)

map在内部使用它来放置和查找条目。否则,find必须将您提供的密钥与每个其他条目逐一进行比较,并且您无法按关键顺序迭代地图。

基本上,map可以有效地按顺序存储元素。要做到这一点,他们必须有一些方法来了解 的顺序,他们通过调用operator<来做到这一点(除非你另有说明)。

答案 1 :(得分: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"           }
};