map-list的使用

==================================================================================

#include	<iostream>
#include	<string>
#include	<list>
#include	<hash_map>
#include 	<list>




using namespace std;
/*
hash_map定义在__gnu_cxx命名空间中,
故你必须在使用时限定名字空间__gnu_cxx::hash_map
或者使用using关键字
*/
using namespace __gnu_cxx;




/*如果你希望在hash中使用std::string就需要多做一点点;你需要自己加上这段代码*/
namespace __gnu_cxx
{
	template<> struct hash<string>
	{
		size_t operator()(const string& s) const
		{
			return __stl_hash_string(s.c_str());
		}
	};
}


struct CUid{
	string cltuid;
	char nattype;
};
typedef list<CUid> DEV_LIST;
typedef list<CUid> ::iterator DEV_IT;






struct CDevsid{
	DEV_LIST  cltAddrList;	
	char flag;
};
typedef hash_map<string, CDevsid* > sidSfdMap;
typedef hash_map<string, CDevsid*>::iterator	sidSfdIterator;


//key=devsid的map
sidSfdMap sidmap;	




//相等返回TRUE
bool operator  == (const CUid &one, const CUid &other)
{	
	if (one.cltuid == other.cltuid)
    {	
		return true;
    }
    return false;
}




int main()
{
	DEV_IT cltIt;
	/*
	map查找插入
	*/
	string sid = "1";
	sidSfdIterator	sidIt = sidmap.find(sid);
	if(sidIt == sidmap.end())
	{
		CDevsid *newdevice = new CDevsid;
		newdevice->flag = 'A';
		sidmap.insert(pair<string, CDevsid*>(sid, newdevice));
		cout<<"insert sid="+sid<<" to sidmap ok"<<endl;
	}
	/*
	*/
	string  devid1 = "2";
	sidIt = sidmap.find(devid1);
	if(sidIt == sidmap.end())
	{
		CDevsid *newdevice1 = new CDevsid;
		newdevice1->flag = 'B';
		sidmap.insert(pair<string, CDevsid*>(devid1, newdevice1));
		cout<<"insert sid="+devid1<<" to sidmap ok"<<endl;
	}
	/*
	*/
	string  devid2 = "3";
	sidIt = sidmap.find(devid2);
	if(sidIt == sidmap.end())
	{
		CDevsid *newdevice2 = new CDevsid;
		newdevice2->flag = 'C';
		sidmap.insert(pair<string, CDevsid*>(devid2, newdevice2));
		cout<<"insert sid="+devid2<<" to sidmap ok"<<endl;
	}
	
	
	/*
	list查找插入
	*/
	cout<<"================================================="<<endl;
	CUid newclt1;
	newclt1.cltuid = "111111";
	sidIt = sidmap.find(sid);
	if(sidIt != sidmap.end())
	{
		cltIt = find(sidIt->second->cltAddrList.begin(),sidIt->second->cltAddrList.end(), newclt1);
		if(cltIt == sidIt->second->cltAddrList.end())
		{
			sidIt->second->cltAddrList.push_back(newclt1);
			cout<<"insert uid=" +newclt1.cltuid + " to sid="+sid<<" ok"<<endl;
		}
	}
	/*
	*/
	CUid newclt2;
	newclt2.cltuid = "222222";
	sidIt = sidmap.find(sid);
	if(sidIt != sidmap.end())
	{
		cltIt = find(sidIt->second->cltAddrList.begin(),sidIt->second->cltAddrList.end(), newclt2);
		if(cltIt == sidIt->second->cltAddrList.end())
		{
			sidIt->second->cltAddrList.push_back(newclt2);
			cout<<"insert uid=" +newclt2.cltuid + " to sid="+sid<<" ok"<<endl;
		}
	}
	/*
	*/
	CUid newclt3;
	newclt3.cltuid = "333333";
	sidIt = sidmap.find(sid);
	if(sidIt != sidmap.end())
	{
		cltIt = find(sidIt->second->cltAddrList.begin(),sidIt->second->cltAddrList.end(), newclt3);
		if(cltIt == sidIt->second->cltAddrList.end())
		{
			sidIt->second->cltAddrList.push_back(newclt3);
			cout<<"insert uid=" +newclt3.cltuid + " to sid="+sid<<" ok"<<endl;
		}
	}
	
	/*
	map遍历输出
	注意额:
	[1]下面是可以的,因为存在sidIt->first即string,这样就利用string的+操作
	cout<<"sid="+sidIt->first+"value flag="+sidIt->second->flag<<endl;
	[2]下面是不可以的,
	cout<<"==="+sidIt->second->flag<<endl;
	*/
	cout<<"================================================="<<endl;
	for(sidIt=sidmap.begin();sidIt != sidmap.end();sidIt++)
	{
		cout<<"sid="+sidIt->first+"value flag="<<sidIt->second->flag<<endl;
		// cout<<"==="+sidIt->second->flag<<endl;
	} 
	
	
	/*
	map查找删除
	*/
	cout<<"================================================="<<endl;
	string finda = "2";
	sidIt = sidmap.find(finda);
	if(sidIt != sidmap.end())
	{
		if(sidIt->second->cltAddrList.size() == 0)
		{
			cout<<"delete sid=2 from sidmap where value flag="<<sidIt->second->flag<<endl;
			delete sidIt->second;
			sidmap.erase(sidIt);
		}
	}
	
	
	/*
	map遍历输出
	*/
	cout<<"================================================="<<endl;
	for(sidIt=sidmap.begin();sidIt != sidmap.end();sidIt++)
	{
		cout<<"sid="+sidIt->first+"value flag="+sidIt->second->flag<<endl;
	}
	


	/*
	list删除
	*/
	cout<<"================================================="<<endl;
	sidIt = sidmap.find("1");
	if(sidIt != sidmap.end())
	{
		CUid newclt;
		newclt.cltuid = "111111";
		cltIt = find(sidIt->second->cltAddrList.begin(),\
								sidIt->second->cltAddrList.end(), newclt);
		if(cltIt != sidIt->second->cltAddrList.end())
		{
			cout<<"delete uid="+cltIt->cltuid<<" from sid=1"<<endl;
			cltIt = sidIt->second->cltAddrList.erase(cltIt); 
		}
	}
	
	
	/*
	map list 全部删除
	*/
	for(sidIt=sidmap.begin();sidIt != sidmap.end();)
	{
		if(sidIt->second->flag != '\0')
		{
			cltIt = sidIt->second->cltAddrList.begin();
			while(cltIt != sidIt->second->cltAddrList.end())
			{
				cout<<"delete uid="<<cltIt->cltuid<<" from sid="+sidIt->first+" from sidmap"<<endl;
				//返回下个迭代器
				cltIt = sidIt->second->cltAddrList.erase(cltIt); 	
			}
			cout<<"delete sid="+sidIt->first<<" from sidmap"<<endl;
			delete sidIt->second;
			sidmap.erase(sidIt++);
		}
		else
		{
			 sidIt++;
		}
	}
}




















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ygmdream

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值