设为首页收藏本站

新微赢技术网

 找回密码
 注册
搜索
热搜: 回贴
查看: 1348|回复: 6
打印 上一主题 下一主题

一个关于map对象保存的问题

[复制链接]
跳转到指定楼层
1#
发表于 2009-11-3 02:05:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是一个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;
}
2#
发表于 2009-11-3 02:05:25 | 只看该作者
这是一个map对象保存的程序,我弄不清楚的是书上说定义word类对象的运算符<,是为了维护一个有序的关健字列表,那这个运算符是什么时候调用的呢?


这个<运算符,可以让map对象,知道word类对象的大小。map是一个有序的容器,可以认为放进去的对象,map都会比较他们的大小。没有仔细研究过map,所以还不知道是什么时候比较的。
回复 支持 反对

使用道具 举报

3#
发表于 2009-11-3 02:05:27 | 只看该作者
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源码
回复 支持 反对

使用道具 举报

4#
发表于 2009-11-3 02:05:31 | 只看该作者
谢谢
回复 支持 反对

使用道具 举报

5#
发表于 2009-11-3 02:05:32 | 只看该作者
dictionary.insert(pair<word,meaning>(word("programming"),meaning("the act of writing a program.")));

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

使用道具 举报

6#
发表于 2009-11-3 02:05:34 | 只看该作者
以下是引用yanglinayp在2006-5-17 21:52:00的发言:

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

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

嗯,是的,你自己也可以想想啊,如果不先构造word类,怎么用word类重载的操作符啊
回复 支持 反对

使用道具 举报

7#
发表于 2009-11-3 02:05:35 | 只看该作者
thank!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

申请友链|小黑屋|最新主题|手机版|新微赢技术网 ( 苏ICP备08020429号 )  

GMT+8, 2024-11-18 03:27 , Processed in 0.079268 second(s), 8 queries , Gzip On, Memcache On.

Powered by xuexi

© 2001-2013 HaiAn.Com.Cn Inc. 寰耽

快速回复 返回顶部 返回列表