?? 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 + -