#include <iostream> #include <string> #include <vector> #include <set> #include <map> using namespace std; /*int main() { int a; a = 10; cout<<" "<<a<<endl; return 0; } */ typedef struct com{ string id; vector<string> subnode; vector<string> clid; set<string> nlid; }comcross; void init1(vector<comcross> &com_vec,map<string,vector<string> > &map_com); void init2(vector<comcross> &com_vec, map<string,vector<string> > &map_com); int main() { vector<comcross> com_vec; map<string,vector<string> > map_com; init1( com_vec,map_com); init2( com_vec,map_com); for(vector<comcross> ::iterator iter = com_vec.begin();iter != com_vec.end();++iter) { for(set<string> ::iterator iter1 = iter->nlid.begin();iter1 != iter->nlid.end();++iter1) { cout<<" "<<*iter1; } } system("pause"); return 0; } void init1( vector<comcross> &com_vec,map<string,vector<string> > &map_com) { string A[] = {"1","2","3","4"}; string B[] = {"3","5","6","7"}; string C[] = {"7","8","9","10"}; string D[] = {"4","10","11","12"}; //初始化map_com vector<string> tmp1(A,A+4),tmp2(B,B+4),tmp3(C,C+4),tmp4(D,D+4); map_com["A"]=tmp1; map_com["B"]=tmp2; map_com["C"]=tmp3; map_com["D"]=tmp4; //初始化com_vec comcross com; com.id = "A"; string clid[]={"1","2","5","6","8","9","11","12"}; vector<string> tmp5(clid,clid+8); com.clid = tmp5; string subnode[] = {"B","C","D"}; vector<string> tmp6(subnode,subnode+3); com.subnode = tmp6; string nlid[] ={"1","2","3","4"}; vector<string> tmp7(nlid,nlid+4); com.nlid.insert(tmp7.begin(),tmp7.end()); com_vec.push_back(com); } void init2(vector<comcross> &com_vec, map<string,vector<string> > &map_com) { vector<comcross>:: iterator iter = com_vec.begin(); for(;iter != com_vec.end();++iter) { for(vector<string>:: iterator subiter1 = iter->subnode.begin();subiter1 != iter->subnode.end();++subiter1) { string subnodekey = *subiter1; map<string,vector<string> >::iterator mapit = map_com.find(subnodekey); if(mapit!=map_com.end()){ iter->nlid.insert(mapit->second.begin(),mapit->second.end()); } } } for(iter = com_vec.begin();iter != com_vec.end();++iter) { for(vector<string> ::iterator subiter = iter->clid.begin();subiter != iter->clid.end();++subiter) { iter->nlid.erase(*subiter); } } }
輸出: node
一、爲何set輸出不是順序的呢???? linux
C++ STL中標準關聯容器set, multiset, map, multimap內部採用的就是一種很是高效的平衡檢索二叉樹:紅黑樹,也成爲RB樹(Red-Black Tree)。map和set的樹創建之時就會自動排好序, ios
該set中字符串按照字典序排序,因此10排在3,4,7前面。。。 api
二、容器erase越界問題(Linux下segmentation fault(core dumped)問題) 測試
容器erase操做以後返回下一個iterator,因此不要在循環內部作刪除操做。 spa
通常都是由內存訪問越界形成的,無論是用戶態程序仍是內核態程序訪問越界都會出core。 調試
在linux下通常使用gdb進行調試,避免這種問題就是在編寫程序時,使用規範的邏輯,和保證健壯性的判斷 code
小測試: 排序
#include<stdio.h> int main() { int *p; *p=12; return 1; }在程序中對非法地址p進行寫操做,執行程序時顯示segmentation fault。
#include<stdio.h> int main() { int *p, temp; temp=*p; return 1; }在程序中對p指向地址進行 非法讀操做 ,執行時顯示segmentation fault。