==================================================================================
#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++;
}
}
}