欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-13 19:10:28
...

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

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

 

   通过 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;
}

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

 

   通过对文件的读取 , 实现复杂类型通讯录功能 . 

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

 

相关标签: 原创