最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++簡單集合類的實現(xiàn)方法

 更新時間:2016年07月08日 16:16:08   投稿:lijiao  
如何使用C++實現(xiàn)一個簡單的集合類,這篇文章主要介紹了C++簡單集合類的實現(xiàn)方法,感興趣的小伙伴們可以參考一下

來自于C++程序設(shè)計的一個題目。實現(xiàn)一個集合類,要求實現(xiàn)以下4個操作。
 1.向集合中添加元素,如果集合中已存在元素則不添加
 2.從集合中移除元素,移除之前需要先判斷集合中元素是否存在
 3.重載+運算符,用以實現(xiàn)集合的求并集運算
 4.重載*運算符,用以實現(xiàn)集合的求交集運算 

1.類的整體設(shè)計
該問題需要模擬實現(xiàn)集合類,我們可以使用數(shù)組來模擬集合,于是使用int items[100]用來存放集合中的數(shù)據(jù)。為了實現(xiàn)數(shù)組的遍歷,這就需要一個整數(shù)用來表示數(shù)組中元素的個數(shù),于是使用int number來表示數(shù)組中元素的個數(shù);此外,為了實現(xiàn)題目的需求,設(shè)計以下四個函數(shù):
 1).使用add_item(int item)成員函數(shù)向數(shù)組中添加元素
 2).使用remove_item(int item)成員函數(shù)向數(shù)組中移除元素
 3).重載operator+表示集合的求并集運算
 4).重載operator*表示集合的求交集運算
由于向集合添加元素之前,必須確保集合中不存在該元素;在從集合中移除元素之前,必須確保集合中存在該元素,因此添加is_exist(int item)方法用以判斷集合中是否存在這個元素;此外為了顯示集合,添加display()方法, 基本設(shè)計如下:

 class Set
{
public:
  int items[100]; //定義一個數(shù)組作為容器存放100個集合元素
  int number; //定義數(shù)字i表示集合中元素的個數(shù)
  //構(gòu)造函數(shù)和析構(gòu)函數(shù)
  Set() {
    this->number = 0;
    memset(this->items,0,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();
  //判斷集合當(dāng)中是否存在item,返回元素在集合中的位置,不存在返回-1
  int is_exist(int item);
}; 

2.構(gòu)造函數(shù)

 Set() {
  this->number = 0;
  memset(this->items,0,sizeof(items));
} 

在構(gòu)造函數(shù)中,我們對數(shù)組進行初始化,聲明完數(shù)組之后,如果不進行初始化,數(shù)組元素是隨機值,在C語言中,變量不進行初始化都會被分配隨機值。為了避免這種情況,我們使用memset函數(shù)對數(shù)組items所有元素全部賦值為0;同時,由于此時數(shù)組中沒有元素,即元素個數(shù)為0,我們的number也應(yīng)當(dāng)賦值為0. 

3.判斷數(shù)組中是否包含元素 item

 int Set::is_exist(int item)
{
  for(int i=0; i< this->number; i++) {
    if(this->items[i] == item) {
      return i;
    }
  }
  return -1;
} 

該函數(shù)用于判斷數(shù)組中是否存在item元素,如果存在就返回item元素的位置,如果不存在就返回-1. 判斷方法非常簡單,寫一個for循環(huán)從items[0]-items[number-1]一個一個進行遍歷。如果相等,直接返回i,此時i就是數(shù)組中item元素的位置;如果遍歷完整個數(shù)組之后,都沒有發(fā)現(xiàn)與item相等的數(shù)組元素,說明數(shù)組中不存在item這個元素,于是返回-1. 

4.向數(shù)組中添加元素

 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;
} 

首先判斷數(shù)組中是否存在該元素,如果存在則不能再向集合中添加元素,直接返回false,如果不存在,則向數(shù)組中的number所指向的那個位置添加該元素,然后number作為數(shù)組元素個數(shù)的指示器+1,這樣就完成了添加元素。 

5.保護數(shù)組元素不被修改
寫到這里,我們發(fā)現(xiàn),數(shù)組元素個數(shù)指示器this->number,對于該問題的幾個算法都起到了核心的作用,首先,我們依賴于數(shù)組元素個數(shù)指示器遍歷數(shù)組,如果number值遭到修改,會導(dǎo)致無法遍歷數(shù)組。舉個例子來說,當(dāng)我們調(diào)用下列語句以后:

 Set set1;
set1.add_item(1);
set1.add_item(2);
set1.add_item(3); 

集合set1中的數(shù)組items變?yōu)閇1,2,3],數(shù)組元素個數(shù)指示器number=3,此時,如果我們還想向集合set1中添加元素20,我們需要利用number=3這個指示器,讓set1.items[number]=20,并且讓number+1以指向下一個位置,即number=4。但是如果用戶手動修改number值,比如set1.number=50;此時,我們的number就不再能指示數(shù)組元素的正確位置,從而導(dǎo)致以上所有算法所依賴的number失效,因此,我們需要對數(shù)組本身,以及數(shù)組元素個數(shù)指示器number進行私有化,以避免用戶隨意篡改。于是:

 class Set
{
public:
  //構(gòu)造函數(shù)和析構(gòu)函數(shù)
  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();
  //判斷集合當(dāng)中是否存在item,返回元素在集合中的位置,不存在返回-1
  int is_exist(int item);
private:
  int items[100]; //定義一個數(shù)組作為容器存放100個集合元素
  int number; //定義數(shù)字i表示集合中元素的個數(shù)
}; 

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;
} 

首先檢查要移除的元素在結(jié)合中是否存在,如果不存在,則直接返回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當(dāng)中,最后返回集合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當(dāng)中,然后遍歷集合B,對于B中的每一個元素,首先判斷是否在A中存在,如果不存在則將其加入到集合C中,最終返回集合C

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++ 數(shù)據(jù)結(jié)構(gòu)完全二叉樹的判斷

    C++ 數(shù)據(jù)結(jié)構(gòu)完全二叉樹的判斷

    這篇文章主要介紹了C++ 數(shù)據(jù)結(jié)構(gòu)完全二叉樹的判斷的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C語言詳細圖解浮點型數(shù)據(jù)的存儲實現(xiàn)

    C語言詳細圖解浮點型數(shù)據(jù)的存儲實現(xiàn)

    使用編程語言進行編程時,需要用到各種變量來存儲各種信息。變量保留的是它所存儲的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個變量時,就會在內(nèi)存中保留一些空間。您可能需要存儲各種數(shù)據(jù)類型的信息,操作系統(tǒng)會根據(jù)變量的數(shù)據(jù)類型,來分配內(nèi)存和決定在保留內(nèi)存中存儲什么
    2022-05-05
  • C語言中const,指針和引用的關(guān)系

    C語言中const,指針和引用的關(guān)系

    這篇文章主要為大家介紹了C語言的const,指針和引用,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • C++ 11實現(xiàn)檢查是否存在特定的成員函數(shù)

    C++ 11實現(xiàn)檢查是否存在特定的成員函數(shù)

    C++11/14相比以往的C++98/03在很多方面做了簡化和增強,尤其是在泛型編程方面,讓C++的泛型編程的威力變得更加強大,下面這篇文章主要介紹了利用C++ 11實現(xiàn)檢查是否存在特定成員函數(shù)的相關(guān)資料,需要的朋友可以參考下。
    2017-02-02
  • C語言實現(xiàn)萬年歷源碼

    C語言實現(xiàn)萬年歷源碼

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)萬年歷源碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • C++中二叉堆排序詳解

    C++中二叉堆排序詳解

    這篇文章主要介紹了C++中二叉堆排序詳解,主要介紹了二叉堆排序(遞歸和非遞歸實現(xiàn)上沉、下沉算法),需要的朋友可以參考下
    2023-01-01
  • C++實現(xiàn)批量提取PDF內(nèi)容

    C++實現(xiàn)批量提取PDF內(nèi)容

    這篇文章主要為大家詳細介紹了如何使用C++批量提取PDF里文字內(nèi)容并導(dǎo)出到表格以及批量給?PDF?文件改名,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-02-02
  • C++移動語義介紹與使用講解

    C++移動語義介紹與使用講解

    首先,移動語義和完美轉(zhuǎn)發(fā)這兩個概念是在C++的模板編程的基礎(chǔ)上,新增的特性,主要是配合模板來使用。本篇會從C++的值類型,到移動拷貝與移動賦值來理解移動語義與完美轉(zhuǎn)發(fā)
    2022-09-09
  • C語言借助EasyX實現(xiàn)的生命游戲源碼

    C語言借助EasyX實現(xiàn)的生命游戲源碼

    這篇文章主要介紹了C語言借助EasyX實現(xiàn)的生命游戲的方法,需要的朋友可以參考下
    2014-07-07
  • C語言驅(qū)動開發(fā)內(nèi)核特征碼掃描PE代碼段

    C語言驅(qū)動開發(fā)內(nèi)核特征碼掃描PE代碼段

    這篇文章主要為大家介紹了C語言驅(qū)動開發(fā)內(nèi)核特征碼掃描PE代碼段,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10

最新評論

吉木萨尔县| 南江县| 商水县| 宁化县| 彭州市| 宽甸| 潜山县| 安仁县| 申扎县| 广西| 吉林省| 大庆市| 安图县| 三原县| 宕昌县| 灵寿县| 游戏| 遂昌县| 大庆市| 土默特右旗| 宁安市| 股票| 蓝田县| 武隆县| 雅江县| 永城市| 穆棱市| 尚义县| 罗平县| 灵寿县| 浪卡子县| 山丹县| 确山县| 英吉沙县| 阜新市| 务川| 连城县| 巴中市| 乌苏市| 望城县| 盐池县|