亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++實現動態數組功能

2020-05-23 13:25:17
字體:
來源:轉載
供稿:網友

數組

數組是一種線性表數據結構。它用一組連續內存空間,來存儲一組具有相同數據類型數據。

1.線性表:數據存儲像一條線一樣的結構,每個線性表上的數據最多只有前和后的兩個方向,如數組、鏈表、隊列、棧等都是這種結構,所以實現的數組的動態操作,其他結構也可輕易的類似實現。更重要的是,在這之后看源碼就可大大降低難度。(博主自己看的是STL源碼剖析)
2.非線性表:如二叉樹、堆、圖等。
3連續內存空間和相同數據類型:當數組作插入、刪除操作時,為了保證數據的連續性,往往需要做大量的數據搬移工作,效率很低。

動態數組功能實現

1.數組初始化

考慮到擴容時數據搬移可能會發生的內存泄露,博主這里采用兩只手的原則,即設定一個內存標志位 ItemsFlag 。當 ItemsFlag = 0,using preitems;當 ItemsFlag = 1,using items。下文擴容部分有具體實現。默認數組容量10。

enum { MAX = 10 };explicit GenericArray(int ss = MAX);template<class T>GenericArray<T>::GenericArray(int ss) : capacity(ss),counts(0){ itemsFlag = 0; preitems = new T[capacity]; items = nullptr;}

2.析構函數

釋放內存。

template<class T>GenericArray<T>::~GenericArray(){  if (preitems != nullptr) delete[]preitems;  if (items != nullptr) delete[]items;}

3.檢查下標

檢查要操作的下標是否在數組容量范圍內。

template<class T>bool GenericArray<T>::checkIndex(int index){ if (index < 0 || index >= capacity) {  int cap = capacity - 1;  cout << "Out of the range! Please ensure the index be   in 0 ~ " << cap << '/n';  return false; } return true;}

4.獲取元素數目和容量、判斷數組空和滿

int count()const { return counts; }int getCapacity()const { return capacity; }bool isEmpty()const { return counts == 0; }bool isFull()const { return counts >= capacity; }

5.取索引對應值、按索引修改值、打印輸出、是否包含某值

template<class T>T GenericArray<T>::get(int index){ if (!itemsFlag) return preitems[index]; else return items[index];}void GenericArray<T>::set(int index, T elem){ if(checkIndex(index)) { if (!itemsFlag) preitems[index] = elem; else items[index] = elem; return; }}template<class T>void GenericArray<T>::printArray()const{ for (int i = 0; i < counts; i++) if (!itemsFlag)  cout << preitems[i] << '/t'; else  cout << items[i] << '/t';  cout << '/n'; return;}template<class T>bool GenericArray<T>::contains(T arr){ for (int i = counts - 1; i >= 0; i--) if (!itemsFlag) {  if (arr == preitems[i])  return true; } else {  if (arr == items[i])  return true; } return false;}

6.查找某值下標、刪除某值

查找某值的下標時,要考慮到該值在數組中是否重復,所以博主用了一個結構體 findArrIndex 來存儲該值重復的次數和對應的下標。

struct findArrIndex{ int numIndex; int *findIndex;};template<class T>void GenericArray<T>::find(T arr, findArrIndex *ps){ ps->findIndex = new int[counts]; ps->numIndex = 0; for (int i = 0, j = 0; i < counts; i++, j++) if (!itemsFlag) {  if (arr == preitems[i])  {  (ps->findIndex)[j] = i;  (*ps).numIndex++;  cout << i << '/t';  } } else  if (arr == items[i])  {  (ps->findIndex)[j] = i;  (*ps).numIndex++;  cout << i << '/t';  } cout << '/n'; return;}template<class T>void GenericArray<T>::removeElement(findArrIndex *ps){ for (int i = ps->numIndex; i > 0; i--) remove((ps->findIndex)[i - 1]); delete[](ps->findIndex);}template<class T>void GenericArray<T>::set(int index, T elem){ if(checkIndex(index)) { if (!itemsFlag) preitems[index] = elem; else items[index] = elem; return; }}

7.擴容

添加數據操作時需判斷數組容量是否足夠,若不夠需考慮擴容。

template<class T>void GenericArray<T>::renewCapacity(){ cout << "The array's capacity is small! Renew capacity./n"; if (capacity < 1000) capacity = capacity << 1; else capacity = capacity >> 1 + capacity; if (!itemsFlag) { itemsFlag = 1; items = new T[capacity]; for (int i = 0; i<counts; i++)  *(items + i) = *(preitems + i);  //items[i]=proitems[i]; //cout << items << '/n'; //cout << preitems << '/n'; delete[]preitems; preitems = nullptr; } else { itemsFlag = 0; preitems = new T[capacity]; for (int i = 0; i<counts; i++)  *(preitems + i) = *(items + i); delete[]items; items = nullptr; }}

8.添加數據:數組添加數據包括按索引下標插值、數組頭插值、數組尾插值。實質上后兩種都可以通過調用按索引下標插值函數實現。前文也提到過,數組添加操作中復雜的是大量的數據搬移工作:將某個元素按索引下標插入到數組第k個位置,需要將k ~ n部分的元素向后搬移一位,然后插入元素,更新元素數目。若插入到數組尾,時間復雜度O(1);插入到數組頭,時間復雜度O(n);插入的平均時間復雜度為(1+2+…+n)/n = O(n)。
另外,還有一個優化問題:若數組是無序數組,則插入時不需要搬移數據:若將某個元素插入到數組第k個位置,首先將該位置的元素移動到數組末尾,然后將待插入元素插入到第k個位置,時間復雜度O(1)。

template<class T>void GenericArray<T>::add(int index, T elem){ if (isFull()) { cout << "Array is full!" << '/n'; renewCapacity(); } if (checkIndex(index)) if(!itemsFlag) {  for (int i = counts; i > index; i--)  preitems[i] = preitems[i - 1];  preitems[index] = elem; } else {  for (int i = counts; i > index; i--)  items[i] = items[i - 1];  items[index] = elem; } counts++; return;}template<class T>void GenericArray<T>::addFirst(T elem){ add(0, elem);}template<class T>void GenericArray<T>::addLast(T elem){ add(counts, elem);}

9.刪除數據:數組刪除數據包括按索引下標刪除、數組頭刪除、數組尾刪除。實質上后兩種都可以通過調用按索引下標刪除函數實現。與前文類似,數組刪除操作中復雜的也是大量的數據搬移工作:按索引下標將某個元素刪除,需要將k+1 ~ n部分的元素向前搬移一位,更新元素數目。若刪除數組尾,直接元素數目減一即可,時間復雜度O(1);刪除數組頭,時間復雜度O(n);刪除的平均時間復雜度(1+2+…+n)/n = O(n)。
另外,有一個優化問題:如果想多次刪除數組中的值,可以先對要刪除的值做好標記,做完標記后一次刪除,這樣就大大減少了搬移的次數。

template<class T>T GenericArray<T>::remove(int index){ if (!isEmpty()) {  if (checkIndex(index)) {  if (!itemsFlag)  {  T temp = preitems[index];  for (int i = index+1; i < counts; i++)   preitems[i - 1] = preitems[i];  counts--;  return temp;  }  else  {  T temp = items[index];  for (int i = index + 1; i < counts; i++)   items[i - 1] = items[i];  counts--;  return temp;  } } } else { cout << "Array is empty!" << '/n'; return -1; }}template<class T>T GenericArray<T>::removeFirst(){ return remove(0);}template<class T>T GenericArray<T>::removeLast(){ return remove(counts - 1);}

好啦,基本上就這么多了。

最后總結一下,多看源碼還是很重要的。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产国语videosex另类| 久久成人免费视频| 97视频国产在线| 日韩av综合中文字幕| 欧美疯狂xxxx大交乱88av| 国产69久久精品成人看| 国产精品白丝av嫩草影院| 精品色蜜蜜精品视频在线观看| 欧美视频在线观看免费网址| 日韩动漫免费观看电视剧高清| 国产精品88a∨| 日韩在线观看免费全集电视剧网站| 欧美激情在线视频二区| 日韩欧美一区二区三区| 欧美激情一区二区三级高清视频| 亚洲成人av片在线观看| 成人欧美一区二区三区在线湿哒哒| 91国产在线精品| 亚洲高清久久久久久| 这里精品视频免费| 欧美激情视频在线免费观看 欧美视频免费一| 国产激情视频一区| 欧美怡红院视频一区二区三区| 中文字幕精品一区二区精品| 最近2019年中文视频免费在线观看| 亚洲激情在线观看视频免费| 97免费中文视频在线观看| 精品人伦一区二区三区蜜桃网站| 97在线免费视频| 欧美精品xxx| 国产精品91久久| 精品爽片免费看久久| 久久精品国产视频| 日韩av最新在线| 欧美一区二区三区四区在线| 国产精品高清在线| 国产精品人人做人人爽| 91久久中文字幕| 亚洲精品一区二三区不卡| 亚洲最大福利网站| 久久久久久国产精品| 欧美激情按摩在线| 欧美激情欧美激情在线五月| 成人黄在线观看| 亚洲无限乱码一二三四麻| 欧美日韩精品二区| 国产精品一区av| 精品二区三区线观看| 欧美大胆a视频| 欧美高清性猛交| 国产一区二区三区在线观看视频| 日韩美女免费观看| 日韩在线观看高清| 亚洲性夜色噜噜噜7777| 91成人免费观看网站| 亚洲第一色中文字幕| 亚洲福利视频久久| 91在线免费看网站| 国产精品一区=区| 欧美午夜美女看片| 日韩精品中文字幕在线| 中文字幕亚洲综合久久筱田步美| 91亚洲精品久久久久久久久久久久| 欧美精品videosex牲欧美| 亚洲图片欧洲图片av| 久久免费视频在线| 国产在线视频91| 久久精品这里热有精品| 亚洲国产精品久久精品怡红院| 欧美视频免费在线| 国产精品自拍偷拍视频| 乱亲女秽乱长久久久| 国产99久久精品一区二区 夜夜躁日日躁| 久久伊人精品一区二区三区| 性欧美xxxx视频在线观看| 26uuu久久噜噜噜噜| 成人午夜黄色影院| 日本高清+成人网在线观看| 亚洲国内高清视频| 久久九九免费视频| 98午夜经典影视| 日韩欧美国产视频| 日韩av网址在线观看| 亚洲激情视频网站| 欧美色另类天堂2015| 亚洲bt天天射| 欧美疯狂性受xxxxx另类| 日本亚洲精品在线观看| 国产精品av在线| 亚洲人成在线一二| 国内揄拍国内精品少妇国语| 日韩一区二区福利| 欧美性猛交xxxx乱大交3| 在线视频一区二区| 日韩精品极品在线观看播放免费视频| 久久香蕉国产线看观看网| 日韩暖暖在线视频| 欧美极品少妇xxxxⅹ喷水| 2019中文字幕全在线观看| 91久久精品美女| 亚洲男人天堂视频| 成人黄色在线免费| 国产精品久久久久99| 国产精品色视频| 97av在线视频免费播放| 91干在线观看| 欧美最近摘花xxxx摘花| 日韩在线视频线视频免费网站| 午夜精品一区二区三区av| 精品国内产的精品视频在线观看| 亚洲精选在线观看| 亚洲性av网站| 国产亚洲精品美女久久久久| 亚洲人成在线观看网站高清| 色七七影院综合| 国产日韩欧美日韩| 国产亚洲福利一区| 亚洲国产成人久久综合一区| 日韩在线观看免费全集电视剧网站| 亚洲xxxx视频| 在线成人一区二区| 成人黄色午夜影院| 亚洲va欧美va国产综合久久| 亚洲第一福利在线观看| 国产区精品在线观看| 精品久久久国产| 欧美人与性动交a欧美精品| 国产91露脸中文字幕在线| 91中文字幕一区| 国产精品流白浆视频| 91超碰caoporn97人人| 91精品视频一区| 在线看日韩av| 欧美影院久久久| 欧美成人精品一区二区| 一区二区欧美久久| 国产午夜精品一区二区三区| 日韩国产精品视频| 欧美黑人极品猛少妇色xxxxx| 中文字幕一区二区精品| 日本精品视频在线播放| 精品福利免费观看| 国产亚洲精品一区二555| 国产精品视频网址| 亚洲国产小视频在线观看| 51精品国产黑色丝袜高跟鞋| 92福利视频午夜1000合集在线观看| 98精品在线视频| 日韩av在线天堂网| 欧美性理论片在线观看片免费| 成人免费在线视频网址| 91免费国产视频| 在线丨暗呦小u女国产精品| 亚洲电影成人av99爱色| 久久99精品久久久久久青青91| 欧美视频国产精品| 欧美日韩中文字幕综合视频| 欧美美女操人视频| 欧美性xxxxx极品娇小| 日韩欧美aⅴ综合网站发布| 欧美大成色www永久网站婷| 88xx成人精品| 中文字幕亚洲欧美日韩2019| 欧美有码在线视频|