| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1970 人关注过本帖
标题:一个关于map对象保存的问题
只看楼主 加入收藏
yanglinayp
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2006-3-21
收藏
 问题点数:0 回复次数:6 
一个关于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;
}

[此贴子已经被作者于2006-5-16 21:18:59编辑过]

搜索更多相关主题的帖子: map 对象 保存 
2006-05-16 21:17
柳儿
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:1830
专家分:30
注 册:2004-9-23
收藏
得分:0 
这是一个map对象保存的程序,我弄不清楚的是书上说定义word类对象的运算符<,是为了维护一个有序的关健字列表,那这个运算符是什么时候调用的呢?


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

成功会使人骄傲。如果你骄傲自大,你就会停止学习。不学习,人就停止了进步
2006-05-17 10:26
aogun
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:638
专家分:0
注 册:2006-4-5
收藏
得分:0 

mm问题好多啊
首先:你的问题:[QUOTE]我弄不清楚的是书上说定义word类对象的运算符<,是为了维护一个有序的关健字列表,那这个运算符是什么时候调用的呢?又是怎么完成关健字有序的呢?[/QUOTE]
答:因为map类在每插入一次记录的时候,都会根据关键字对新插入的记录和已存在的记录进行排序,定义的map<word,meaning>dictionary中word类是作为关键字的,那么word类就必须支持<操作符,为什么必须支持<操作符呢,因为map是模板类,它的关键字可以定义为任何类型,那么它要排序的话就要求用户定义的关键字支持<操作符,所以代码中的word类重载了<操作符

[QUOTE]word (){strcpy(str,"");} 和 word(char *s){strcpy(str,s);}在程序中又起到什么作用呢?无参的构造函数有被调用过吗?[/QUOTE]
答:word (){strcpy(str,"");}是默认构造函数,程序中如果初始化类的对象的时候没有给初始值的话就会调用默认构造函数,例如代码中map<word,meaning>dictionary;语句的执行就会调用默认构造函数,默认构造函数及构造函数的知识是类的基本知识,mm应该恶补c++的类这一章节的基础知识后再问这个问题

[QUOTE]它又是怎样实现一个有序的序列的呢?[/QUOTE]
答:根据word类重载的<操作符在insert方法中实现有序序列,mm实在感兴趣的话可以研究stl源码


世界上总共有 10 种人,一种懂得什么是二进制 ,一种不懂。
2006-05-17 10:54
yanglinayp
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2006-3-21
收藏
得分:0 
谢谢

我是小小登山者!
2006-05-17 21:38
yanglinayp
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2006-3-21
收藏
得分:0 
dictionary.insert(pair<word,meaning>(word("programming"),meaning("the act of writing a program.")));
还有一个问题,上面这条语句在执行时应该既调用了有参的构造函数,又调了<运算符重载吧,那它又是按怎么一个先后顺序进行的呢??是不是先创建的对象调用构造函数,然后在插入时调用运算符重载???

[此贴子已经被作者于2006-5-17 22:49:54编辑过]


我是小小登山者!
2006-05-17 21:52
aogun
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:638
专家分:0
注 册:2006-4-5
收藏
得分:0 
以下是引用yanglinayp在2006-5-17 21:52:00的发言:
dictionary.insert(pair<word,meaning>(word("programming"),meaning("the act of writing a program.")));
还有一个问题,上面这条语句在执行时应该既调用了有参的构造函数,又调了<运算符重载吧,那它又是按怎么一个先后顺序进行的呢??是不是先创建的对象调用构造函数,然后在插入时调用运算符重载???

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


世界上总共有 10 种人,一种懂得什么是二进制 ,一种不懂。
2006-05-18 09:23
yanglinayp
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2006-3-21
收藏
得分:0 
thank!

我是小小登山者!
2006-05-18 19:55
快速回复:一个关于map对象保存的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017120 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved