1. 程式人生 > 其它 >使用STL容器要注意判斷容器是否為空

使用STL容器要注意判斷容器是否為空

這次主要是在使用vector時發現的,而priority_queuequeuestack等就不多說了,肯定要使用empty函式判斷是否為空。

本次在做 PAT甲級 1097 Deduplication on a Linked List (25 分)時發現的錯誤
原本在輸出時沒有使用if (l1.size()>0)if (l1.size()>0),序號為2的點出現了段錯誤
以下為原本程式碼(出現段錯誤的程式碼)

      #include<iostream>
      #include<cmath>
      #include<vector>
      using namespace std;
      const int maxn=1e7+10;
      struct node{
      	int addr;
      	int key;
      	int next;
      }p[maxn];
      bool is[maxn];
      vector<node> l1,l2;
      int main(){
      	int n,s1,s2;
      	scanf("%d%d",&s1,&n);
      	int addr,key,next,tmp,ti;
      	for (int i=0;i<n;i++){
      		scanf("%d",&addr);
      		scanf("%d%d",&p[addr].key,&p[addr].next);
      		p[addr].addr=addr;
      	}
      	int count=0;
      	
      	for (int i=s1;i!=-1;i=p[i].next){
      		count++;
      		if (is[abs(p[i].key)]==false){
      			is[abs(p[i].key)]=true;
      			//p[i].addr=i;
      			//p[i].flag=1;
      			l1.push_back(p[i]);
      		}
      		else{
      			l2.push_back(p[i]);
      		}
      	}
      	//printf("%d %d %d\n",count,l1.size(),l2.size());
      	//if (l1.size()>0){
          for (int i=0;i<l1.size()-1;i++){
              printf("%05d %d %05d\n",l1[i].addr,l1[i].key,l1[i+1].addr);
          }
          printf("%05d %d -1\n",l1[l1.size()-1].addr,l1[l1.size()-1].key);
      	//}
      	
      	//if (l2.size()>0){
          for (int i=0;i<l2.size()-1;i++){
              //printf("%d\n",l2.size()-1);
              printf("%05d %d %05d\n",l2[i].addr,l2[i].key,l2[i+1].addr);
          }
          printf("%05d %d -1\n",l2[l2.size()-1].addr,l2[l2.size()-1].key);
      	//}
      	
          return 0;
      }

以下為AC程式碼

      #include<iostream>
      #include<cmath>
      #include<vector>
      using namespace std;
      const int maxn=1e7+10;
      struct node{
      	int addr;
      	int key;
      	int next;
      }p[maxn];
      bool is[maxn];
      vector<node> l1,l2;
      int main(){
      	int n,s1,s2;
      	scanf("%d%d",&s1,&n);
      	int addr,key,next,tmp,ti;
      	for (int i=0;i<n;i++){
      		scanf("%d",&addr);
      		scanf("%d%d",&p[addr].key,&p[addr].next);
      		p[addr].addr=addr;
      	}
      	int count=0;
      	
      	for (int i=s1;i!=-1;i=p[i].next){
      		count++;
      		if (is[abs(p[i].key)]==false){
      			is[abs(p[i].key)]=true;
      			//p[i].addr=i;
      			//p[i].flag=1;
      			l1.push_back(p[i]);
      		}
      		else{
      			l2.push_back(p[i]);
      		}
      	}
      	//printf("%d %d %d\n",count,l1.size(),l2.size());
      	if (l1.size()>0){
      		for (int i=0;i<l1.size()-1;i++){
      			printf("%05d %d %05d\n",l1[i].addr,l1[i].key,l1[i+1].addr);
      		}
      		printf("%05d %d -1\n",l1[l1.size()-1].addr,l1[l1.size()-1].key);
      	}
      	
      	if (l2.size()>0){
      		for (int i=0;i<l2.size()-1;i++){
      			//printf("%d\n",l2.size()-1);
      			printf("%05d %d %05d\n",l2[i].addr,l2[i].key,l2[i+1].addr);
      		}
      		printf("%05d %d -1\n",l2[l2.size()-1].addr,l2[l2.size()-1].key);
      	}
      	
      	return 0;
      }