?? p213214.cpp
字號:
#include <assert.h>#include <iostream.h>const int DefaultSize = 100;class Set {//用位向量來存儲集合元素。這些集合元素只具有整數類型, 集合元素的取值范圍在0到MaxSetSize-1之間。public: Set ( int MaxSetSize = DefaultSize ); //構造函數 ~Set ( ) { delete [ ] bitVector; } //析構函數 void MakeEmpty ( ); //置空集合 int AddMember ( const int x ); //加入新成員x int DelMember ( const int x ); //刪除老成員x void operator = ( Set & right ); //集合right賦值給集合this void operator + ( Set & right ); //求集合this與集合right的并 void operator * ( Set & right ); //求集合this與集合right的交 void operator - ( Set & right ); //求集合this與集合right的差 int Contains ( const int x ); //判元素x是否集合this的成員 int SubSet ( Set & right ); //判集合this是否集合right的子集 int operator == ( Set & right ); //判集合this與集合right是否相等 friend ostream& operator <<(ostream& strm, Set& a);private: int * bitVector; //存儲集合元素的位向量 int MaxSize; //向量大小};Set::Set (int MaxSetSize) : MaxSize (MaxSetSize) { //構造函數 assert ( MaxSize > 0 ); //檢查參數的合理性 bitVector = new int [MaxSize]; //分配一個整型數組給位向量 assert ( bitVector != 0 ); //檢查存儲分配是否成功 for ( int i=0; i<MaxSize; i++ ) bitVector[i] = 0; //初始化為空集合}void Set::MakeEmpty ( ) { for ( int i=0; i<MaxSize; i++ ) bitVector[i] = 0; } //置空集合int Set::AddMember ( const int x ) { //把x加入到集合this中 assert ( x >= 0 && x < MaxSize ); //檢查x的合理性 if ( ! bitVector[x] ) { bitVector[x] = 1; return 1; } return 0; //x所在的位原來為0, 表示x不在集合中加入, 在相應位置置1}int Set::DelMember ( const int x ) { //把x從集合中刪去 assert ( x >= 0 && x < MaxSize ); //判斷元素x的合理性 if ( bitVector[x] ) { bitVector[x] = 0; return 1; } return 0; //若位向量在x處的值為1, 表示x在集合中該位置置0, 表示x刪去}void Set::operator = ( Set & right ) { //把集合right的值復制到集合this中 assert ( MaxSize == right.MaxSize ); //判斷兩集合的大小是否相等 for ( int i=0; i<MaxSize; i++ ) bitVector[i] = right.bitVector[i]; //相等則位向量按位傳送數據}void Set::operator + (Set & right ) { //求兩集合right與this的并 assert ( MaxSize == right.MaxSize ); //判斷兩集合的大小是否相等 for ( int i=0; i<MaxSize; i++ ) bitVector[i] = bitVector[i]|| right.bitVector[i]; //按位求"或"}void Set::operator * (Set & right ) { //求兩集合right與this的交 assert ( MaxSize == right.MaxSize ); //判斷兩集合的大小是否相等 for ( int i=0; i<MaxSize; i++) bitVector[i] = bitVector[i] && right.bitVector[i]; //按位求"與"}void Set::operator - ( Set & right ) { //求集合this與集合right的差 assert ( MaxSize == right.MaxSize ); //判斷兩集合的大小是否相等 for ( int i=0; i<MaxSize; i++ ) bitVector[i] = bitVector[i] && ! right.bitVector[i]; //按位求"異或"}int Set::Contains ( const int x ) { //測試元素x是否集合的成員。是則返回1, 否則返回0。 assert ( x >= 0 && x < MaxSize ); //判斷元素x是否合理 return bitVector[x]; //合理則返回相關信息}int Set::operator == ( Set & right ) { //測試集合this與集合right是否相等。若相等, 則函數返回1, 否則返回0。 assert ( MaxSize == right.MaxSize ); //判斷兩集合的元素個數是否相等 for ( int i=0; i<MaxSize; i++) //相等則按位判斷對應位是否相等 if ( bitVector[i] != right.bitVector[i] ) return 0; return 1;}int Set::SubSet (Set & right ) { //若集合this是集合right的子集, 則函數返回1, 否則函數返回0。 assert ( MaxSize == right.MaxSize ); //判斷兩集合的元素個數是否相等 for ( int i=0; i<MaxSize; i++) //相等再按位判斷 if ( bitVector[i] && ! right.bitVector[i] ) return 0; return 1; //this集合該位為1而right集合該位為0, 則返回0, 兩集合不等}ostream& operator <<(ostream& strm, Set& a){ for (int i=0;i<a.MaxSize;i++) if (a.bitVector[i]) { strm<<i<<' '; } strm<<endl; return strm;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -