C++ 操作员在哪里<&引用;在这个样本中使用了什么?
我用“map”尝试了STL示例程序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必须将您提供的键与其他每个条目逐一进行比较,并且无法按键顺序迭代映射 基
#包括
#包括
#包括
使用名称空间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" }
};