STL 结构体数据插入,map键值对实现,通讯录实现

版权声明:如需转载,请联系原作者授权... https://blog.csdn.net/Superman___007/article/details/82314631

   使用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;
}
*/

猜你喜欢

转载自blog.csdn.net/Superman___007/article/details/82314631