对象管理器 3种方法实现 struct、 vector、map

实现对象管理器功能,其中管理的对象有3个外部关键字,要求实现:

        

增加对象;

删除对象;

判断对象是否存在;

说明: 对象的三个外部关键字分别以KEY1,KEY2,KEY3表示


方法1:链表的方式



#include "ObjMgt.h"
#include <iostream>
using namespace std;
typedef struct Node
{
	unsigned int ky1;
	unsigned int ky2;
	unsigned int ky3;
	struct Node * next;
}NNode,*pNode;
unsigned int cnt = 0;
pNode head = NULL;
/*************************************************************************
功能:增加单个对象
输入:
key1  外部关键字 KEY1 
key2  外部关键字KEY2
key3  外部关键字KEY3
输出:无
返回: 
      -1 :失败(对象已经存在或者其它异常)
       0 :成功
***************************************************************************/
int AddObject (unsigned int key1, unsigned int key2, unsigned int key3)
{
    /*请实现*/
	if(IsObjectExist(key1,key2,key3) || (cnt >= 10000))
		return -1;
	pNode p1 = (pNode)malloc(sizeof(NNode));
	if(NULL == p1)
		exit(-1);
	p1->ky1 = key1;
	p1->ky2 = key2;
	p1->ky3 = key3;
	p1->next = NULL;
	if(NULL == head)
	{
		head = p1;
		cnt = 1;
	}
	else
	{
		pNode p2 = head;
		while(p2->next != NULL)
			p2 = p2->next;
		p2->next = p1;
		++cnt;
	}
    return 0;
}

/********************************************************************************
功能:删除一个或多个对象
输入:
      key1 外部关键字 KEY1 
      key2 外部关键字 KEY2
      key3 外部关键字 KEY3
输出:无
返回:无

说明:用例保证参数取值为合法值和通配符0xFFFFFFFF, 通配符表示0~65535范围内的任意值; 
      举例:key1=1,key2=2,key3= 0xFFFFFFFF,表示删除key1=1,key2=2的所有对象;
           key1,key2,key3取值全为0xFFFFFFFF时,表示删除所有对象。
*********************************************************************************/
void DeleteObject (unsigned int key1, unsigned int key2, unsigned int key3)
{
    /*请实现*/
	if(NULL == head)
	{
		cnt = 0;	
		return;
	}
	pNode p2 = head;
	/*while((p2 != NULL) && ((p2->ky1 == key1) || (p2->ky1 == 0xFFFFFFFF)) && ((p2->ky2 == key2) || (p2->ky2 == 0xFFFFFFFF)) && ((p2->ky3 == key3) || (p2->ky3 == 0xFFFFFFFF)))*/
	//while((p2 != NULL) && (p2->ky1 == key1 || p2->ky1 == 0xFFFFFFFF) && (p2->ky2 == key2 || p2->ky2 == 0xFFFFFFFF) && (p2->ky3 == key3 || p2->ky3 == 0xFFFFFFFF))
	while((p2 != NULL) && ((p2->ky1 == key1) || (key1 == 0xFFFFFFFF)) && ((p2->ky2 == key2) || (key2 == 0xFFFFFFFF)) && ((p2->ky3 == key3) || (key3 == 0xFFFFFFFF)))
	{                   //通配符表示的是key1,而不是让某个节点的值为通配符
		--cnt;
		head = head->next;
		free(p2);
		p2 = head;					
	}
	if(NULL == head)
	{
		cnt = 0;	
		return;
	}
	pNode p1 = head;
	p2 = p1->next;
	while(p2 != NULL)
	{
		//if((p2->ky1 == key1 || p2->ky1 == 0xFFFFFFFF) && (p2->ky2 == key2 || p2->ky2 == 0xFFFFFFFF) && (p2->ky3 == key3 || p2->ky3 == 0xFFFFFFFF))
		if(((p2->ky1 == key1) || (key1 == 0xFFFFFFFF)) && ((p2->ky2 == key2) || (key2 == 0xFFFFFFFF)) && ((p2->ky3 == key3) || (key3 == 0xFFFFFFFF)))
		{
			p1->next = p2->next;
			free(p2);
			--cnt;
			p2 = p1->next;
		}
		else
		{
			p2 = p2->next;
			p1 = p1->next;
		}
	}
    return ;
}

/********************************************************************************
功能:查询单个对象是否存在
输入:
      key1 外部关键字 KEY1 
      key2 外部关键字 KEY2
      key3 外部关键字 KEY3
输出:无
返回:
      0:不存在
      1:存在
**********************************************************************************/
int IsObjectExist (unsigned int key1, unsigned int key2, unsigned int key3)
{
    /*请实现*/
	if(NULL == head)
		return 0;
	pNode p2 = head;
	while(p2 != NULL)
	{
		//if((p2->ky1 == key1 || p2->ky1 == 0xFFFFFFFF) && (p2->ky2 == key2 || p2->ky2 == 0xFFFFFFFF) && (p2->ky3 == key3 || p2->ky3 == 0xFFFFFFFF))
		if((p2->ky1 == key1) && (p2->ky2 == key2) && (p2->ky3 == key3))
		{
			return 1;
		}
		else
			p2 = p2->next;
	}
	return 0;
	//while(p2->next != NULL)
	//{
	//	if(p2->ky1 == key1)
	//		if(p2->ky2 == key2)
	//			if(p2->ky3 == key3)
	//				return 1;
	//	p2 = p2->next;
	//}
	//if(p2->ky1 == key1)
	//	if(p2->ky2 == key2)
	//		if(p2->ky3 == key3)
	//			return 1;
 //   return 0;
}

/******************************************************************************************************
Description     清空所有对象
Prototype       void Clear();
Input Param     无
Output Param    无
Return Value    无

********************************************************************************************************/
void Clear(void)
{
    /*在这里实现功能*/
	pNode p1 = head;
	while(p1 != NULL)
	{
		head = head->next;
		free(p1);
		p1 = head;
	}
	head = NULL;
	p1 = NULL;
	cnt = 0;
    return;
}

方法2:map映射和vector结合

#include "ObjMgt.h"
#include <iostream>
#include <map>
#include <vector>
using namespace std;

map<long long,bool> ObjMa;
/*************************************************************************
功能:增加单个对象
输入:
key1  外部关键字 KEY1 
key2  外部关键字KEY2
key3  外部关键字KEY3
输出:无
返回: 
      -1 :失败(对象已经存在或者其它异常)
       0 :成功
***************************************************************************/
int AddObject (unsigned int key1, unsigned int key2, unsigned int key3)
{
    /*请实现*/
	long long Lkey1 = (long long)key1;
	long long Lkey2 = (long long)key2;
	long long Lkey3 = (long long)key3;
	Lkey1 <<= 32;
	Lkey2 <<= 16;
	long long key = Lkey1 + Lkey2 + Lkey3;
	if(!ObjMa.count(key))
		ObjMa[key] = true;
	else
		return -1;
    return 0;
}

/********************************************************************************
功能:删除一个或多个对象
输入:
      key1 外部关键字 KEY1 
      key2 外部关键字 KEY2
      key3 外部关键字 KEY3
输出:无
返回:无

说明:用例保证参数取值为合法值和通配符0xFFFFFFFF, 通配符表示0~65535范围内的任意值; 
      举例:key1=1,key2=2,key3= 0xFFFFFFFF,表示删除key1=1,key2=2的所有对象;
           key1,key2,key3取值全为0xFFFFFFFF时,表示删除所有对象。
*********************************************************************************/
void DeleteObject (unsigned int key1, unsigned int key2, unsigned int key3)
{
    /*请实现*/
	map<long long,bool>::iterator it;
	unsigned int myky1,myky2,myky3;
	vector<long long> keyRrase;
	for(it = ObjMa.begin();it != ObjMa.end();++it)
	{
		long long ky = (*it).first;
		myky1 = (ky & 0xFFFF00000000)>>32;
		myky2 = (ky & 0xFFFF0000)>>16;
		myky3 = ky & 0xFFFF;
		if((0xFFFFFFFF == key1 || myky1 == key1) &&
			(0xFFFFFFFF == key2 || myky2 == key2) &&
			(0xFFFFFFFF == key3 || myky3 == key3))
		{
			keyRrase.push_back(ky);
		}
	}
	for(unsigned int i = 0;i < keyRrase.size();++i)
		ObjMa.erase(keyRrase[i]);
	return ;
}

/********************************************************************************
功能:查询单个对象是否存在
输入:
      key1 外部关键字 KEY1 
      key2 外部关键字 KEY2
      key3 外部关键字 KEY3
输出:无
返回:
      0:不存在
      1:存在
**********************************************************************************/
int IsObjectExist (unsigned int key1, unsigned int key2, unsigned int key3)
{
    /*请实现*/
	long long Lkey1 = (long long)key1;
	long long Lkey2 = (long long)key2;
	long long Lkey3 = (long long)key3;
	Lkey1 <<= 32;
	Lkey2 <<= 16;
	long long key = Lkey1 + Lkey2 + Lkey3;
	if(ObjMa.count(key))
		return 1;
    return 0;
}

/******************************************************************************************************
Description     清空所有对象
Prototype       void Clear();
Input Param     无
Output Param    无
Return Value    无

********************************************************************************************************/
void Clear(void)
{
    /*在这里实现功能*/
	ObjMa.clear();
    return;
}
方法3:vector向量使用,注意struct的定义方式,这种定义里面有构造函数,可以直接赋值

#include "ObjMgt.h"
#include <vector>
using namespace std;

struct Object
{
	unsigned int key1;
	unsigned int key2;
	unsigned int key3;
	Object(unsigned int a,unsigned int b,unsigned int c)
	{
		key1 = a;
		key2 = b;
		key3 = c;
	}
	Object(){}
};

vector<Object> container;

/*************************************************************************
功能:增加单个对象
输入:
key1  外部关键字 KEY1 
key2  外部关键字KEY2
key3  外部关键字KEY3
输出:无
返回: 
      -1 :失败(对象已经存在或者其它异常)
       0 :成功
***************************************************************************/
int AddObject (unsigned int key1, unsigned int key2, unsigned int key3)
{
    /*请实现*/
	int isExist = IsObjectExist(key1,key2,key3);
	if(isExist)
	{
		return -1;
	}
	Object o(key1,key2,key3);
	container.push_back(o);	
    return 0;
}

/********************************************************************************
功能:删除一个或多个对象
输入:
      key1 外部关键字 KEY1 
      key2 外部关键字 KEY2
      key3 外部关键字 KEY3
输出:无
返回:无

说明:用例保证参数取值为合法值和通配符0xFFFFFFFF, 通配符表示0~65535范围内的任意值; 
      举例:key1=1,key2=2,key3= 0xFFFFFFFF,表示删除key1=1,key2=2的所有对象;
           key1,key2,key3取值全为0xFFFFFFFF时,表示删除所有对象。
*********************************************************************************/
void DeleteObject (unsigned int key1, unsigned int key2, unsigned int key3)
{
    /*请实现*/
	Object o;
	vector<Object>::iterator ite = container.begin();
	while(ite != container.end())
	{
		o = *ite;
		if((o.key1 == key1 || key1 == 0xFFFFFFFF) && (o.key2 == key2 || key2 == 0xFFFFFFFF) && (o.key3 == key3 || key3 == 0xFFFFFFFF))
			ite = container.erase(ite);
		else
			++ite;
	}
    return ;
}

/********************************************************************************
功能:查询单个对象是否存在
输入:
      key1 外部关键字 KEY1 
      key2 外部关键字 KEY2
      key3 外部关键字 KEY3
输出:无
返回:
      0:不存在
      1:存在
**********************************************************************************/
int IsObjectExist (unsigned int key1, unsigned int key2, unsigned int key3)
{
    /*请实现*/
	int size = container.size();
	Object o;
	for(int i = 0;i < size;++i)
	{
		o = container[i];
		if(o.key1 == key1 && o.key2 == key2 && o.key3 == key3)
			return 1;
	}
    return 0;
}

/******************************************************************************************************
Description     清空所有对象
Prototype       void Clear();
Input Param     无
Output Param    无
Return Value    无

********************************************************************************************************/
void Clear(void)
{
    /*在这里实现功能*/
	container.clear();
    return;
}


一般的struct的定义方式

#include "ObjMgt.h"
#include <vector>
using namespace std;
typedef struct{
	unsigned int key1;
	unsigned int key2;
	unsigned int key3;
}KEY;
vector <KEY> allKey;
/*************************************************************************
功能:增加单个对象
输入:
key1  外部关键字 KEY1 
key2  外部关键字KEY2
key3  外部关键字KEY3
输出:无
返回: 
      -1 :失败(对象已经存在或者其它异常)
       0 :成功
***************************************************************************/
int AddObject (unsigned int key1, unsigned int key2, unsigned int key3)
{
    /*请实现*/
	if(allKey.size() > 10000)
		return -1;
	if(key1 > 65535 || key2 > 65535 || key3 > 65535)
		return -1;
	int i,j = allKey.size();
	for(i = 0;i < j;i++)
		if(allKey[i].key1 == key1 && allKey[i].key2 == key2 && allKey[i].key3 == key3)
			return -1;
	KEY k = {key1,key2,key3};
	allKey.push_back(k);
    return 0;
}

/********************************************************************************
功能:删除一个或多个对象
输入:
      key1 外部关键字 KEY1 
      key2 外部关键字 KEY2
      key3 外部关键字 KEY3
输出:无
返回:无

说明:用例保证参数取值为合法值和通配符0xFFFFFFFF, 通配符表示0~65535范围内的任意值; 
      举例:key1=1,key2=2,key3= 0xFFFFFFFF,表示删除key1=1,key2=2的所有对象;
           key1,key2,key3取值全为0xFFFFFFFF时,表示删除所有对象。
*********************************************************************************/
void DeleteObject (unsigned int key1, unsigned int key2, unsigned int key3)
{
    /*请实现*/
	/*bool allKey1,allKey2,allKey3;*/
	//int i,j = allKey.size();
	vector<KEY>::iterator it;
	it = allKey.begin();
	while(it != allKey.end())
	{
		if(0xFFFFFFFF == key1 || it->key1 == key1)
			if(0xFFFFFFFF == key2 || it->key2 == key2)
				if(0xFFFFFFFF == key3 || it->key3 == key3)
				{
					it = allKey.erase(it);
					continue;
				}
		it++;
	}
	
    return ;
}

/********************************************************************************
功能:查询单个对象是否存在
输入:
      key1 外部关键字 KEY1 
      key2 外部关键字 KEY2
      key3 外部关键字 KEY3
输出:无
返回:
      0:不存在
      1:存在
**********************************************************************************/
int IsObjectExist (unsigned int key1, unsigned int key2, unsigned int key3)
{
    /*请实现*/
	if(key1 > 65535 || key2 > 65535 || key3 > 65535)
		return 0;
	int i,j = allKey.size();
	for(i = 0;i < j;++i)
		if(allKey[i].key1 == key1 && allKey[i].key2 == key2 && allKey[i].key3 == key3)
			return 1;
    return 0;
}

/******************************************************************************************************
Description     清空所有对象
Prototype       void Clear();
Input Param     无
Output Param    无
Return Value    无

********************************************************************************************************/
void Clear(void)
{
    /*在这里实现功能*/
    allKey.clear();
	return;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值