map-list的使用

来源:互联网 发布:sqlserver date tochar 编辑:程序博客网 时间:2024/06/05 02:09

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

#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*>::iteratorsidSfdIterator;//key=devsid的mapsidSfdMap sidmap;//相等返回TRUEbool 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";sidSfdIteratorsidIt = 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++;}}}




















0 0
原创粉丝点击