STL 结构体数据插入,map键值对实现,通讯录实现
使用list 实现插入结构体的数据 , 通过重载输出 , 并实现对数据的查找 , 删除操作 .
#include<iostream>
#include<list>
using namespace std;
class people
{
public:
void show()
{
cout<<"ID:"<<id<<"name:"<<name<<"sex:"<<sex<<endl;
}
friend void add(list<people>&);
friend list<people>::iterator find(string name,list<people>& l);
friend void Del(list<people>&,int);
friend ostream& operator<<(ostream&,people&);
private:
int id;
string name;
char sex;
};
ostream& operator<<(ostream& output,people& p)
{
output<<p.id<<" "<<p.name<<"" <<p.sex<<" ";
return output;
}
//模板:插入
void add(list<people>& l)
{
//插入节点
people p;
cin>>p.id>>p.name>>p.sex;
l.push_back(p);
}
//查找
list<people>::iterator find(string name,list<people>&l)
{
//遍历:从左往右(时间度为n)
list<people>::iterator it=l.begin();
while(it!=l.end())
{
if(it->name==name)
return it;
it++;
}
it--;
return it;
}
void Del(list<people>& l,int n)
{
list<people>::iterator it=l.begin();
while(it!=l.end())
{
if(it->id==n)
{
l.erase(it);
break;
}
it++;
}
}
int main()
{
list<people> l;
int i=0;
for(i=0;i<3;i++)
add(l);
Del(l,111);
list<people>::iterator result=find("chh",l);
//访问方法
result->show();
/*
while(!l.empty())
{
cout<<l.front()<<endl;
l.pop_front();
}
*/
return 0;
}
map的键值对操作 .
iterator insert( iterator pos, const pair<KEY_TYPE,VALUE_TYPE> &val );
通过 pair 来设置键值对 , pair也是构造函数来实现的 ,可以自己实例化 pair 来初始化值 .
//pair<char,int> data('m',97);
//m.insert(m.begin(),data);
在插入元素的时候 :
pair 的实现如下 , first 指向key second 指向 value :
template<typename T1,Typename T2>
class pair
{
public:
pair(T1&,T2&);
//属性:Key
T1& first; //指向该Key-value中的key
T2& second; //指向该Key-value中的key
};
通过map的 find('key'); 来查找map的值元素 , 然后 find('key'); 返回的是迭代器(迭代器也就是地址) , 所以下面定义了一个迭代器来接受 find('key'); 返回的地址 .
#include<iostream>
#include<map>
using namespace std;
//关联容器:map
//key-value
int main()
{
//实例化: m key-value '字符'---INT
map<char,int> m;
//添加“键值 对” 插入到头位置
//实例化键-值类型
//pair<char,int> data('m',97);
//m.insert(m.begin(),data);
m.insert(m.begin(),pair<char,int>('a',97));
m.insert(m.begin(),pair<char,int>('b',98));
m.insert(m.begin(),pair<char,int>('c',99));
m.insert(m.begin(),pair<char,int>('d',100));
m.insert(m.begin(),pair<char,int>('e',101));
m.insert(m.begin(),pair<char,int>('e',101));
//查找:
map<char,int>:: iterator result =m.find('c');
if(result!=m.end())//查找成功
{
cout<<result->first<<":"<<result->second<<endl;
}
//遍历:迭代器
map<char,int>::iterator it=m.begin();
while(it!=m.end())
{
cout<<it->first<<" "<<it->second<<endl;
it++;
}
}
通过 map 实现简单的通讯录效果 , 就是把 map 的键值对的值 通过 list (链表) 来实现的 .
#include<iostream>
#include<map>
#include<list>
#include<string>
using namespace std;
int main()
{
//Key-Value
map<char,list<string> > m;
char ch='a';
while(ch<='z')
{
m.insert(pair<char,list<string> > (ch,list<string>()));
ch++;
}
//将雷小维插入名字到l中 先查找l在那一对Key-value
map<char,list<string> >::iterator result =m.find('l');
if(result!=m.end())
{
//
result->second.push_back("leixiaowei");
result->second.push_back("lifei");
result->second.push_back("lanqi");
result->second.push_back("liumiao");
result->second.push_back("liujing");
result->second.push_back("liujing");
result->second.push_back("luxin");
result->second.push_back("lzh");
}
result =m.find('w');
if(result!=m.end())
{
result->second.push_back("wangchenlin");
result->second.push_back("wangchengen");
result->second.push_back("wenbao");
}
//遍历
result=m.begin();
list<string>::iterator lit;
while(result!=m.end())//把Key遍历完成
{
//打印姓
cout<<result->first<<":"<<endl;
//再遍历value中所有元素
lit=result->second.begin();
while(lit!=result->second.end())
{
cout<<*lit<<endl;
lit++;
}
result++;
}
return 0;
}
通过对文件的读取 , 实现复杂类型通讯录功能 .
#include<iostream>
#include<string>
//C语言的 输入输出
#include<stdio.h>
#include<list>
#include<map>
using namespace std;
//宏
#define FILENAME "classmate.data"
//人类
class people
{
public:
//构造器
people();//无构造
people(int ,const char*);//有参构造---没有无参
//公有接口:获取ID
int getId();
//重载 强转运算符 operator 类型 (void);
operator string()const; // (类型)表达式 (int) 3.14
protected:
int id;
string name;
};
people::people()
{
}
//构造函数
people::people(int i,const char* n):id(i),name(n)
{
}
//获取ID
int people::getId()
{
return this->id;
}
//重载转运算符:
people::operator string() const
{
//name="sb"; 不允许修改
return this->name;
}
//通讯录类
class recorde
{
public://构造器
recorde();
//查找--查找姓名所在键值对
map<char,list<people> >::iterator find(const string name);
//返回---返回该链表中所在的位置
list<people>::iterator find(int id=0);
//插入信息
bool add(const people);
//显示
void display();
bool reloadData();
private:
//关联容器:用于存放Key-Value对
map<char,list<people> > m;
};
recorde::recorde()
{
//对m中初始为26个Key-Value
char ch='a';
while(ch<='z')
{
//向m发送消息:创建Key-Value对
m.insert( pair<char,list<people> >(ch,list<people>()) );
ch++;
}
}
//查找姓名所对应的键值对
map<char,list<people> >::iterator recorde::find(const string name)
{
/*
//迭代
map<char,list<people> >::iterator it=this->m.begin();
while(it!=m.end())
{
if(name[0]==it->first)
break;
it++;
}
//返回地址
return it;
*/
//向m发送消息
return this->m.find(name[0]);
}
//通过ID查找所在链表的位置
list<people>::iterator recorde::find(int id)
{
list<people>::iterator lit;
map<char,list<people> >::iterator mit=m.begin();
while(mit!=m.end())//获取每一个Key-Value中的Value(list)
{
lit=mit->second.begin();
while(lit!=mit->second.end())
{ //people::id(procted)
if(lit->getId()==id)//lit->people::id
return lit;
lit++;
}
mit++;
}
return lit;
}
//增加
bool recorde::add(const people p)//p为空常空间:
{
//lifei 1001 m
//people::naem为保护
map<char,list<people> >::iterator it=this->find((string)p);
if(it==this->m.end())//查找失败
return false;
it->second.push_back(p);//插入数据给的该链表
return true;
}
//遍历
void recorde::display()
{
//迭代器
map<char ,list<people> >::iterator mit=this->m.begin();
list<people>::iterator lit;
while(mit!=this->m.end())
{
//姓氏输出
if(mit->second.size()>0)//只输出有记录的姓氏
{
cout<<endl<<mit->first<<" :"<<endl;
}
lit=mit->second.begin();//获取链表首地址
while(lit!=mit->second.end())
{
cout<<"姓名:"<<(string)*lit<<" 编号:"<<lit->getId()<<endl;
lit++;
}
mit++;
}
}
bool recorde::reloadData()
{
//1打开文件
FILE* fp=fopen(FILENAME,"r");
if(NULL==fp)
return false;
//2操作
char name[100]="";
int id;
while(!feof(fp))
{
fscanf(fp,"%s %d",name,&id);
this->add( people(id,name)/*无名对象*/ );
//文件中文件的读写位置
}
//3关闭
fclose(fp);
}
int main()
{
//实例化
recorde d;
//插入
d.reloadData();
//遍历
d.display();
return 0;
}
/*
//...
int main()
{
//实例化:
map<char,int> m;
//方法:发送消息
m.insert(pair<char,int>('a',97));
m.insert(pair<char,int>('b',98));
m.insert(pair<char,int>('c',99));
cout<<m.size()<<endl;
//遍历:获取第一个节点
map<char,int>:: iterator it=m.begin();
while(it!=m.end())
{
cout<<it->first<<" "<<it->second<<endl;
it++;
}
return 0;
}
*/
上一篇: C#实现 学生成绩信息管理系统
下一篇: 国内常用的PHP框架有哪些?