C++ 操作员在哪里<&引用;在这个样本中使用了什么?

C++ 操作员在哪里<&引用;在这个样本中使用了什么?,c++,stl,C++,Stl,我用“map”尝试了STL示例程序 #包括 #包括 #包括 使用名称空间std; 类ItemName { 字符名[80]; 公众: ItemName(char*s){strcpy(name,s);} char*get(){return name;} }; 布尔算子str; p=项目。查找(str); 如果(p!=items.end()){ cout second.get()它由map在内部用于放置和查找条目。否则,find必须将您提供的键与其他每个条目逐一进行比较,并且无法按键顺序迭代映射 基

我用“map”尝试了STL示例程序

#包括
#包括
#包括
使用名称空间std;
类ItemName
{
字符名[80];
公众:
ItemName(char*s){strcpy(name,s);}
char*get(){return name;}
};
布尔算子str;
p=项目。查找(str);
如果(p!=items.end()){

cout second.get()它由
map
在内部用于放置和查找条目。否则,
find
必须将您提供的键与其他每个条目逐一进行比较,并且无法按键顺序迭代映射


基本上,
map
s有效地按顺序存储元素。要做到这一点,他们必须有某种方法来知道顺序是什么,他们可以通过调用
操作符来实现这一点
std::map
有一个参数来指定如何比较映射中的元素(这是必需的,因为映射总是按键顺序维护其内容)。默认情况下,这是
std::less


std::less
,反过来,将使用
运算符进行比较。您可以轻松地使用
std::string
。C字符串只是额外的工作,没有任何好处。谢谢您的建议。我会记住这一点。这不太正确。第三个模板参数默认情况下是
std::less
使用
operator@DanielFrey谢谢。更新。非常感谢,David Schwartz和Daniel Frey。我看到地图使用了操作符“非常感谢,Jerry Coffin。我能很好地理解它是如何工作的。另外,我也很感谢你告诉我使用std::字符串的替代方法。
#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;
}
std::map<std::string, std::string> items{
    { "potion", "heal HP"       },
    { "key", "unlock a door"    },
    { "lamp", "light"           }
};