我使用"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;
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我不太确定使用运算符"<"的位置.如果我注释掉运算符"<"的定义,我会收到很多错误.
它由内部map用于放置和查找条目.否则,find必须将您提供的密钥与字面上的每个其他条目逐一进行比较,并且您无法按关键顺序迭代地图.
基本上,maps有效地按顺序存储元素.要做到这一点,他们必须有一些方法来了解订单是什么,他们通过调用来做到这一点operator<(除非你另有说明).
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" }
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
92 次 |
| 最近记录: |