新微赢技术网

标题: 一个关于map对象保存的问题 [打印本页]

作者: 飘渺    时间: 2009-11-3 02:05
标题: 一个关于map对象保存的问题
这是一个map对象保存的程序,我弄不清楚的是书上说定义word类对象的运算符<,是为了维护一个有序的关健字列表,那这个运算符是什么时候调用的呢?又是怎么完成关健字有序的呢?还有关于 word (){strcpy(str,"");} 和 word(char *s){strcpy(str,s);}在程序中又起到什么作用呢?无参的构造函数有被调用过吗?它们是在dictionary.insert(pair<word,meaning>(word("house"),meaning("a place of dwelling.")));等一系列语句的实现中被调用的吗?可这个插入语句并没有创建对象啊,那它又是怎样实现一个有序的序列的呢?这些疑惑真是把我给弄的晕了!还请大家多多指教!!!谢谢



#include <iostream>
#include <map>
#include <cstring>
using namespace std;
class word{
char str[20];
public:
word (){strcpy(str,"");}
word(char *s){strcpy(str,s);}
char *get(){return str;}
};
bool operator<(word a,word b){
return strcmp(a.get(),b.get())<0;
}
class meaning{
char str[80];
public:
meaning(){strcmp(str,"");}
meaning(char *s){strcpy(str,s);}
char *get(){return str;}
};
int main()
{
map<word,meaning>dictionary;
dictionary.insert(pair<word,meaning>(word("house"),meaning("a place of dwelling.")));
dictionary.insert(pair<word,meaning>(word("keyboard"),meaning("an input device.")));
dictionary.insert(pair<word,meaning>(word("programming"),meaning("the act of writing a program.")));
dictionary.insert(pair<word,meaning>(word("stl"),meaning("standard template library")));
char str[80];
cout<<"enter word";
cin>>str;
map<word,meaning>::iterator p;
p=dictionary.find(word(str));
if(p!=dictionary.end())
cout<<"definition"<<p->second.get();
else
cout<<"word not in dictionary.\n";
return 0;
}
作者: 哪里找    时间: 2009-11-3 02:05
这是一个map对象保存的程序,我弄不清楚的是书上说定义word类对象的运算符<,是为了维护一个有序的关健字列表,那这个运算符是什么时候调用的呢?


这个<运算符,可以让map对象,知道word类对象的大小。map是一个有序的容器,可以认为放进去的对象,map都会比较他们的大小。没有仔细研究过map,所以还不知道是什么时候比较的。
作者: ゞ↘Μc总督    时间: 2009-11-3 02:05
mm问题好多啊
首先:你的问题:
我弄不清楚的是书上说定义word类对象的运算符<,是为了维护一个有序的关健字列表,那这个运算符是什么时候调用的呢?又是怎么完成关健字有序的呢?

答:因为map类在每插入一次记录的时候,都会根据关键字对新插入的记录和已存在的记录进行排序,定义的map<word,meaning>dictionary中word类是作为关键字的,那么word类就必须支持<操作符,为什么必须支持<操作符呢,因为map是模板类,它的关键字可以定义为任何类型,那么它要排序的话就要求用户定义的关键字支持<操作符,所以代码中的word类重载了<操作符
word (){strcpy(str,"");} 和 word(char *s){strcpy(str,s);}在程序中又起到什么作用呢?无参的构造函数有被调用过吗?

答:word (){strcpy(str,"");}是默认构造函数,程序中如果初始化类的对象的时候没有给初始值的话就会调用默认构造函数,例如代码中map<word,meaning>dictionary;语句的执行就会调用默认构造函数,默认构造函数及构造函数的知识是类的基本知识,mm应该恶补c++的类这一章节的基础知识后再问这个问题
它又是怎样实现一个有序的序列的呢?

答:根据word类重载的<操作符在insert方法中实现有序序列,mm实在感兴趣的话可以研究stl源码
作者: 夜来香    时间: 2009-11-3 02:05
谢谢
作者: 依ing梦    时间: 2009-11-3 02:05
dictionary.insert(pair<word,meaning>(word("programming"),meaning("the act of writing a program.")));

还有一个问题,上面这条语句在执行时应该既调用了有参的构造函数,又调了<运算符重载吧,那它又是按怎么一个先后顺序进行的呢??是不是先创建的对象调用构造函数,然后在插入时调用运算符重载???
作者: 叛逆ぁ太上皇    时间: 2009-11-3 02:05
以下是引用yanglinayp在2006-5-17 21:52:00的发言:

dictionary.insert(pair<word,meaning>(word("programming"),meaning("the act of writing a program.")));

还有一个问题,上面这条语句在执行时应该既调用了有参的构造函数,又调了<运算符重载吧,那它又是按怎么一个先后顺序进行的呢??是不是先创建的对象调用构造函数,然后在插入时调用运算符重载???

嗯,是的,你自己也可以想想啊,如果不先构造word类,怎么用word类重载的操作符啊
作者: 兮哩糊涂の斗    时间: 2009-11-3 02:05
thank!




欢迎光临 新微赢技术网 (http://bbs.weiying.cn/) Powered by Discuz! X3.2