5.保护数组元素不被修改
  写到这里,我们发现,数组元素个数指示器this->number,对于该问题的几个算法都起到了核心的作用,首先,我们依赖于数组元素个数指示器遍历数组,如果number值遭到修改,会导致无法遍历数组。举个例子来说,当我们调用下列语句以后:
  Set set1;
  set1.add_item(1);
  set1.add_item(2);
  set1.add_item(3);
  集合set1中的数组items变为[1,2,3],数组元素个数指示器number=3,此时,如果我们还想向集合set1中添加元素20,我们需要利用number=3这个指示器,让set1.items[number]=20,并且让number+1以指向下一个位置,即number=4。但是如果用户手动修改number值,比如set1.number=50;此时,我们的number不再能指示数组元素的正确位置,从而导致以上所有算法所依赖的number失效,因此,我们需要对数组本身,以及数组元素个数指示器number进行私有化,以避免用户随意篡改。于是:
class Set
{
public:
//构造函数和析构函数
Set() {
this->number = 0;
memset(this->items,0,sizeof(items));
}
//初始化方法
int init(int items[], int num);
//添加元素
bool add_item(int item);
//删除元素
int remove_item(int item);
//求集合的并集
Set operator+ (Set set2);
//求集合的交集
Set operator* (Set set2);
//显示集合元素
int display();
//判断集合当中是否存在item,返回元素在集合中的位置,不存在返回-1
int is_exist(int item);
private:
int items[100]; //定义一个数组作为容器存放100个集合元素
int number; //定义数字i表示集合中元素的个数
};
  6. 从集合中移除元素
  bool Set::remove_item(int item)
  {
  int pos = is_exist(item);
  if(pos == -1) return false;
  for(int i=pos; i< this->number-1; i++) {
  this->items[i] = this->items[i+1];
  }
  this->number--;
  return true;
  }
  首先检查要移除的元素在结合中是否存在,如果不存在,则直接返回false;其次,定位到集合中元素的位置,然后从这个位置开始将集合中剩余的元素逐个前移,后集合元素指示器-1,并返回true.
  7. 求两个集合的交集
  Set Set::operator* (Set set2)
  {
  Set result;
  for(int i=0; i< this->number; i++) {
  if(set2.is_exist(this->items[i]) >= 0) {
  result.items[result.number] = this->items[i];
  result.number++;
  }
  }
  return result;
  }
  算法很简单,遍历集合A中的元素,对于A中的每一个元素判断在集合B中是否存在,如果存在加入到集合C当中,后返回集合C
  8. 求两个集合的并集
Set Set::operator+ (Set set2)
{
Set result;
for(int i=0; i<this->number; i++) {
result.items[result.number] = this->items[i];
result.number++;
}
for(int j=0; j<set2.number; j++) {
if(result.is_exist(set2.items[j]) == -1) {
result.items[result.number] = set2.items[j];
result.number++;
}
}
return result;
}
  首先遍历集合A,将集合A中的元素全部加到集合C当中,然后遍历集合B,对于B中的每一个元素,首先判断是否在A中存在,如果不存在则将其加入到集合C中,终返回集合C