我使用“map”尝试了STL示例程序。
#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;”的定义,我会收到很多错误。
答案 0 :(得分:5)
map
在内部使用它来放置和查找条目。否则,find
必须将您提供的密钥与每个其他条目逐一进行比较,并且您无法按关键顺序迭代地图。
基本上,map
可以有效地按顺序存储元素。要做到这一点,他们必须有一些方法来了解 的顺序,他们通过调用operator<
来做到这一点(除非你另有说明)。
答案 1 :(得分: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" }
};