在map中插入自定义类对象

更新时间:2023-07-13 13:17:41 阅读: 评论:0

在map中插⼊⾃定义类对象
上⼀篇中讲到了map(在头⽂件<map>中)和t(在头⽂件<t>中)的⾼效,但如果不需要对容器中的元素进⾏排序或建⽴映射,那么
⽤vector就⾜够了,⽽且它的实现更简单。下⾯以⼀个简单的例⼦介绍⼀下如何灵活的运⽤map。
卵母细胞假设⼀个学⽣有名字和性别两个属性,对应⼀个编号。那么学⽣类定义如下:
class student指纹鉴定
{
private:
string name;
国产999char gender;
public:
student(string n,char g):name(n),gender(g){} //初始化列表使属性⼀次性赋值完毕,否则需要两次
friend ostream& operator<<(ostream& cout,student &s);  //定义为friend便可拥有访问private属性的权限
};
ostream& operator<<(ostream& cout,student &s)
{
cout<<s.name<<" "<&der;
return cout;
}
在写主函数
int main()
{
map<string,student> sm;
芝士怎么做好吃student ts("lishuai",'M');
sm[“001”] = ts;//检索key=”001”的值,如果存在,⽤ts覆盖,如果不存在,插⼊ts
for(map<string,student>::iterator it = sm.begin();it!=sm.end();it++)
{
cout<<(*it).cond<<endl;调⽤operaotr<<;重载函数打印student对象
}
system("pau");
return 0;
}
运⾏报了⼀堆错:后来发现最根本问题是⽆法找到student()⽆参构造函数。于是在类中添加构造函数
student(){}
后运⾏正确。结果为
lishuai M
说明在插⼊过程中,如果没找到对象,就先调⽤⽆参构造函数。但这只能构造⼀个空的对象,那⼀定还会调⽤赋值函数填写其属性,赋值函数是编译器⾃动为我们写的,为了搞清楚这个具体过程,我⾃⼰来实现。
class student
{
private:
string name;
char gender;
public:
student(){cout<<"Default Constructor"<<endl; name="---------";}//给个空名字
student(string n,char g):name(n),gender(g){cout<<"Constructor:"<<name<<endl;}
student& operator=(const student& s);
student(const student& s);
~student(){cout<<"Destructor:"<<this->name<<endl;}
friend ostream& operator<<(ostream& cout,student &s);
};
student& student::operator=(const student& s)声明范本
{
cout<<"Assignment:"<<s.name<<endl;
this->name = s.name;
this->gender = s.gender;
return *this;
}
student::student(const student& s)
{
static char c='a';
this->name = s.name+c++; //每调⽤⼀次,就改变名字
this->gender = s.gender;
cout<<"Copy Constructor:"<<this->name<<endl;
}
ostream& operator<<(ostream& cout,student &s)
歌词大全{
cout<<s.name<<" "<&der;
return cout;
}小资情调
int main()
{
map<string,student> sm;
student ts("lishuai",'M');
cout<<"begin"<<endl;正宗意大利面
sm["001"]=ts;
cout<<"end"<<endl;
for(map<string,student>::iterator it = sm.begin();it!=sm.end();it++)
{
cout<<(*it).cond<<endl;
}
system("pau");
return 0;
}
运⾏结果:
Constructor:lishuai
begin
Default Constructor                    //构造空对象1
Copy Constructor:---------a              //构造空对象2
Copy Constructor:---------ab            //构造空对象3
Destructor:---------a                    //析构空对象2
Destructor:---------                      //析构空对象1
Assignment:lishuai                                                //给对象3赋值
end
lishuai M
可以看到,在插⼊的过程中,⾸先调⽤1次⽆参构造函数,然后调⽤2次复制构造函数依次复制前⼀个创建的对象,再调⽤两次析构函数析构头2个空对象,最后调⽤⼀次赋值函数。很有意思啊!
我要强调的⼀点就是,当我们⾃定义了有参构造函数,编译器就不再为我们添加默认构造函数了,所以⼀定要记得加上⼀个⽆参构造函数,即使⾥⾯什么都不写,否则就可能遇到我上⾯的那个问题。其他的如赋值和析构函数可根据情况,⾃⼰定义或⽤编译器提供的。
上⾯我们是⽤map实现了编号和学⽣的对应关系。还可以在此基础上建⽴班级号与全班学⽣的对应关系:
map< int , map<string,student> > clas; //在两个>之间⼀定要加空格
clas[1]=sm;      //sm是班内学⽣映射map
clas[1][“001”] = st; //st 是学⽣对象
很简单吧,呵呵。

本文发布于:2023-07-13 13:17:41,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1079885.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:对象   属性   函数
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图