數據結構1:C++實現變長數組

數組作為線性表的一種,具有內存連續這一特點,可以通過下標訪問元素,并且下標訪問的時間復雜的是O(1),在數組的末尾插入和刪除元素的時間復雜度同樣是O(1),我們使用C++實現一個簡單的邊長數組。

數據結構定義

class Array
{
int cur;
int cap;
int *tail;
};

cur是當前元素的個數,cap是數組的總容量,tail是數組最后一個元素的下一個空間地址。

數組接口定義

#include<iostream>
#include<stdlib.h>
#include<time.h>
class Array
{
private:
int cur;
int cap;
int *tail;
void expand(int size);
public:
Array(int size=15);
~Array();// 末尾增加元素void push_back(int val);// 末尾刪除元素void pop_back();// 按位置增加元素void insert(int pos, int val);// 按位置刪除void erase(int pos);// 元素查詢int find(int val);// 打印數據void show()const;
};

這里的expand函數用于給數組擴容,由于擴容操作是由C++標準庫的函數實現的(參考vector),因此我們將expand函數使用private關鍵字修飾,代表這個函數只能被Array自身使用。

函數實現

#include<iostream>
#include<stdlib.h>
#include<time.h>
class Array
{
private:
int cur;
int cap;
int *tail;
void expand(int size)
{int *p=new int[size*sizeof(int)];memcpy(p,tail,size);delete tail;tail=p;cap=size;
}
public:
Array(int size=15):cap(size),cur(0)
{tail=new int[size];
}
~Array()
{delete []tail;tail=nullptr;//防止產生野指針
}// 末尾增加元素void push_back(int val){if(cur>=cap){expand(2*cap);}tail[cur++]=val;}// 末尾刪除元素void pop_back(){if(cur==0)return;cur--;}// 按位置增加元素void insert(int pos, int val){if(pos<0||pos>cur)return;if(cur>=cap)expand(2*cap);for(int i=cur-1;i>=pos;i--){tail[i+1]=tail[i];}tail[pos]=val;cur++;}// 按位置刪除void erase(int pos){if(pos<0||pos>cur||cur==0)return;for(int i=pos+1;i<cur;i++){tail[i-1]=tail[i];}cur--;}// 元素查詢int find(int val){for(int i=0;i<cur;i++){if(tail[i]==val)return i;}return -1;}// 打印數據void show()const{for(int i=0;i<cur;i++){std::cout<<tail[i]<<" ";}std::cout<<std::endl;}
};

接口測試

int main()
{Array array;srand(time(0));for(int i=0;i<10;i++){array.push_back(rand()%100);}array.show();array.insert(1,100);array.show();array.pop_back();array.show();array.erase(2);array.show();std::cout<<array.find(100);
}

輸出結果

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/41171.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/41171.shtml
英文地址,請注明出處:http://en.pswp.cn/web/41171.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

華為OD機試 - 來自異國的客人(Java 2024 D卷 100分)

華為OD機試 2024D卷題庫瘋狂收錄中&#xff0c;刷題點這里 專欄導讀 本專欄收錄于《華為OD機試&#xff08;JAVA&#xff09;真題&#xff08;D卷C卷A卷B卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一題都有詳細的答題思路、詳細的代碼注釋、樣例測…

新手教學系列——前后端分離API優化版

在之前的文章《Vue 前后端分離開發:懶人必備的API SDK》中,我介紹了通過Object對象自動生成API的方法。然而,之前的代碼存在一些冗余之處。今天,我將分享一個改進版本,幫助你更高效地管理API。 改進版API SDK 首先,讓我們來看一下改進后的代碼: import request from …

深入理解 KVO

在 iOS 中&#xff0c;KVO&#xff08;Key-Value Observing&#xff09;是一個強大的觀察機制&#xff0c;它的底層實現相對復雜。KVO 利用 Objective-C 的動態特性&#xff0c;為對象的屬性提供觀察能力。 KVO 的底層實現 1. 動態子類化 當一個對象的屬性被添加觀察者時&am…

6、Redis系統-數據結構-01-String

Redis 數據結構簡介 前言 Redis 是一個高性能的內存數據庫&#xff0c;其關鍵在于其數據結構的設計。Redis 數據結構是指底層實現 Redis 鍵值對中值的數據類型的方式。它包括了以下幾種主要對象&#xff1a; String&#xff08;字符串&#xff09;對象&#xff1a;最基本的數…

[C++][CMake][流程控制]詳細講解

目錄 1.條件判斷1.基本表達式2.邏輯判斷3.比較4.文件操作5.其他 2.循環1.foreach2.while 1.條件判斷 在進行條件判斷的時候&#xff0c;如果有多個條件&#xff0c;那么可以寫多個elseif&#xff0c;最后一個條件可以使用else&#xff0c;但是開始和結束是必須要成對出現的&am…

WordPress常見問題及簡要說明

1. 如何安裝WordPress? 簡要說明&#xff1a;WordPress是一個流行的內容管理系統&#xff0c;可以幫助用戶快速搭建網站。安裝WordPress需要以下幾個步驟&#xff1a;下載WordPress安裝包、上傳到服務器、創建數據庫、配置數據庫信息、完成安裝。 2. 如何創建一個新的WordPr…

掌握電量脈搏:WebKit 電池狀態(Battery Status API)支持全解析

掌握電量脈搏&#xff1a;WebKit 電池狀態&#xff08;Battery Status API&#xff09;支持全解析 隨著移動設備的廣泛使用&#xff0c;Web 應用對設備的電池狀態信息的需求日益增長。Battery Status API 提供了一種方式&#xff0c;允許 Web 應用訪問設備的電池信息&#xff…

【反悔貪心 反悔堆】1642. 可以到達的最遠建筑

本文涉及知識點 反悔貪心 反悔堆 LeetCode1642. 可以到達的最遠建筑 給你一個整數數組 heights &#xff0c;表示建筑物的高度。另有一些磚塊 bricks 和梯子 ladders 。 你從建筑物 0 開始旅程&#xff0c;不斷向后面的建筑物移動&#xff0c;期間可能會用到磚塊或梯子。 當…

Spring Boot中的全局異常處理

Spring Boot中的全局異常處理 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天我們將探討如何在Spring Boot應用中實現全局異常處理&#xff0c;這是保證應用…

VSCode, 請在windows下使用git bash終端

用vscode在windows下調測代碼&#xff0c;運行時默認打開的終端是windows的cmd&#xff0c;很不受我待見。畢竟習慣了linux&#xff0c;習慣了windows下的git bash風格。怎么辦&#xff1f; search&#xff0c;search&#xff0c;research。 先確保windows上安裝了git bash。…

MATLAB 2024b 更新了些什么?

MATLAB 2024b版本已經推出了預覽版&#xff0c;本期介紹一些MATLAB部分的主要的更新內容。 幫助瀏覽器被移除 在此前的版本&#xff0c;當我們從MATLAB中訪問幫助文檔時&#xff0c;默認會通過MATLAB的幫助瀏覽器&#xff08;Help browser&#xff09;。 2024b版本開始&…

【Unity數據交互】如何Unity中讀取Ecxel中的數據

&#x1f468;?&#x1f4bb;個人主頁&#xff1a;元宇宙-秩沅 &#x1f468;?&#x1f4bb; hallo 歡迎 點贊&#x1f44d; 收藏? 留言&#x1f4dd; 加關注?! &#x1f468;?&#x1f4bb; 本文由 秩沅 原創 &#x1f468;?&#x1f4bb; 專欄交流&#x1f9e7;&…

醫院掛號系統小程序的設計

管理員賬戶功能包括&#xff1a;系統首頁&#xff0c;個人中心&#xff0c;患者管理&#xff0c;醫生管理&#xff0c;專家信息管理&#xff0c;科室管理&#xff0c;預約信息管理&#xff0c;系統管理 微信端賬號功能包括&#xff1a;系統首頁&#xff0c;專家信息&#xff0…

數據結構算法-排序(一)-冒泡排序

什么是冒泡排序 冒泡排序&#xff1a;在原數組中通過相鄰兩項元素的比較&#xff0c;交換而完成的排序算法。 算法核心 數組中相鄰兩項比較、交換。 算法復雜度 時間復雜度 實現一次排序找到最大值需要遍歷 n-1次(n為數組長度) 需要這樣的排序 n-1次。 需要 (n-1) * (n-1) —…

Java事務(Transaction)

Java事務&#xff08;Transaction&#xff09;是數據庫管理系統執行過程中的一個邏輯單位&#xff0c;由一個有限的數據庫操作序列組成&#xff0c;這些操作要么全部執行&#xff0c;要么全部不執行&#xff0c;是一個不可分割的工作單位。事務的引入主要是為了解決并發操作數據…

Unity中遇到“Input Button unload_long_back_btn is not setup”問題

當你在Unity中遇到“Input Button unload_long_back_btn is not setup”這個問題時&#xff0c;需要按照以下步驟進行處理&#xff1a; 1. 檢查按鈕名稱 確保你在代碼中使用的按鈕名稱&#xff08;unload_long_back_btn&#xff09;與Unity輸入管理器中的配置完全匹配。 2. …

[AIGC] ClickHouse分布式表與本地表的區別及如何查詢所有本地表記錄

在大規模數據處理和分析場景中&#xff0c;ClickHouse是一種高性能的列式數據庫管理系統。ClickHouse支持分布式表和本地表兩種表類型&#xff0c;本文將介紹這兩種表類型的區別&#xff0c;并探討如何建表以查詢所有本地表的記錄。 文章目錄 一、ClickHouse分布式表與本地表的…

【Linux進階】文件系統7——文件系統簡單操作

1.磁盤與目錄的容量 現在我們知道磁盤的整體數據是在超級區塊中&#xff0c;但是每個文件的容量則在inode 當中記載。 那在命令行模式下面該如何顯示這幾個數據&#xff1f;下面就讓我們來談一談這兩個命令&#xff1a; df&#xff1a;列出文件系統的整體磁盤使用量&#xf…

Poker Game, Run Fast

Poker Game, Run Fast 撲克&#xff1a;跑得快 分門別類&#xff1a; 單張從小到大默認 A < 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < 10 < J < Q < K 跑得快&#xff1a;單張從小到大 3 < 4 < 5 < 6 < 7 < 8 < 9 < 10 &…

javaweb個人主頁設計(html+css+js)

目錄 1 前言和要求 1.1 前言 1.2 設計要求 2 預覽 2.1 主頁頁面 2.2 個人簡介 2.3 個人愛好 2.4 個人成績有代碼&#xff0c;但是圖片已省略&#xff0c;可以根據自己情況添加 2.5 收藏夾 3 代碼實現 3.1 主頁 3.2 個人簡介 3.3 個人愛好 3.4 個人成績&#xff…