C++简单集合类的实现方法
来自于C++程序设计的一个题目。实现一个集合类,要求实现以下4个操作。 1.类的整体设计 class Set { public: int items[100]; //定义一个数组作为容器存放100个集合元素 int number; //定义数字i表示集合中元素的个数 //构造函数和析构函数 Set() { this->number = 0; memset(this->items,sizeof(items)); } //初始化方法 int init(int items[],int num); //添加元素 bool add_item(int item); //删除元素 bool remove_item(int item); //求集合的并集 Set operator+ (Set set2); //求集合的交集 Set operator* (Set set2); //显示集合元素 int display(); //判断集合当中是否存在item,返回元素在集合中的位置,不存在返回-1 int is_exist(int item); }; 2.构造函数 Set() { this->number = 0; memset(this->items,sizeof(items)); } 在构造函数中,我们对数组进行初始化,声明完数组之后,如果不进行初始化,数组元素是随机值,在C语言中,变量不进行初始化都会被分配随机值。为了避免这种情况,我们使用memset函数对数组items所有元素全部赋值为0;同时,由于此时数组中没有元素,即元素个数为0,我们的number也应当赋值为0. 3.判断数组中是否包含元素 item int Set::is_exist(int item) { for(int i=0; i< this->number; i++) { if(this->items[i] == item) { return i; } } return -1; } 该函数用于判断数组中是否存在item元素,如果存在就返回item元素的位置,如果不存在就返回-1. 判断方法非常简单,写一个for循环从items[0]-items[number-1]一个一个进行遍历。如果相等,直接返回i,此时i就是数组中item元素的位置;如果遍历完整个数组之后,都没有发现与item相等的数组元素,说明数组中不存在item这个元素,于是返回-1. 4.向数组中添加元素 bool Set::add_item(int item) { if(is_exist(item) >= 0 || this->number >= 100) { return false; } this->items[this->number] = item; this->number++; return true; } 首先判断数组中是否存在该元素,如果存在则不能再向集合中添加元素,直接返回false,如果不存在,则向数组中的number所指向的那个位置添加该元素,然后number作为数组元素个数的指示器+1,这样就完成了添加元素。 5.保护数组元素不被修改 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,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 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |