網(wǎng)站首頁 編程語言 正文
動態(tài)數(shù)組
動態(tài)數(shù)組Vector可以動態(tài)擴(kuò)展內(nèi)存,其采用連續(xù)的內(nèi)存空間,當(dāng)內(nèi)存空間不足,便以原來的容量的2倍或者1.5倍成倍的擴(kuò)展,將原有的數(shù)組元素拷貝到新分配的內(nèi)存空間中,釋放原有的內(nèi)存空間,新的元素將存入的新分配的內(nèi)存空間。
示例代碼
動態(tài)數(shù)組vector的size函數(shù)和capacity函數(shù),分別作為求數(shù)組中現(xiàn)有的元素的個數(shù)和數(shù)組所能容納的元素的個數(shù)。下面直接上實(shí)現(xiàn)的代碼。
DynamicArray .h
#pragma once
class DynamicArray {
public:
DynamicArray();
~DynamicArray();
void push_back_Array(int value);
void insertValueByPosArray(size_t pos,int value);
void removeByValueFromArray(int value);
void removeByPosFromArray(size_t pos);
int findPosByValueArray(int value);
int findValueByPosArray(size_t pos);
void reclaimSpaceArray();
void clearArray();
int getCapacity();
int getCount();
void printArray();
private:
int *m_pArr;
size_t m_size;
size_t m_capacity;
};
DynamicArray .cpp
#include "DynamicArray.h"
#include <iostream>
using namespace std;
// DynamicArray.cpp
DynamicArray::DynamicArray()
{
m_size = 0;
m_capacity = 20;
m_pArr = new int[m_capacity];
if (m_pArr == nullptr)
{
cout << "new 開辟空間失敗" << endl;
}
}
DynamicArray::~DynamicArray()
{
if (m_pArr != nullptr)
{
delete[] m_pArr;
m_pArr = nullptr;
}
m_size = 0;
m_capacity = 0;
}
void DynamicArray::push_back_Array(int value)//push_back
{
if (m_pArr == nullptr)
{
return;
}
reclaimSpaceArray();
m_pArr[m_size] = value;
m_size++;
}
void DynamicArray::insertValueByPosArray(size_t pos, int value)//插入insert(可以在前,中,后插入)
{
if (m_pArr == nullptr)
{
return;
}
reclaimSpaceArray();
for (size_t i = m_size - 1; i >= pos; --i)//pos為下標(biāo)的數(shù),從0開始
{
m_pArr[i + 1] = m_pArr[i];
}
m_pArr[pos] = value;
m_size++;
}
void DynamicArray::removeByValueFromArray(int value)
{
if (m_pArr == nullptr)
{
return;
}
int nPos = findPosByValueArray(value);
removeByPosFromArray(nPos);
}
void DynamicArray::removeByPosFromArray(size_t pos)//pos為下標(biāo)的數(shù),從0開始
{
if (m_pArr == nullptr)
{
return ;
}
if (pos < 0 || pos >= m_size)//pos的最大值為m_size-1
{
return ;
}
//找到被刪除位置的下一位
for (size_t i = pos + 1; i < m_size; ++i)
{
m_pArr[i - 1] = m_pArr[i];
}
m_size--;
}
int DynamicArray::findPosByValueArray(int value)
{
size_t nPos = -1;
if (m_pArr == nullptr)
{
return nPos;
}
for (size_t i = 0; i < m_size; ++i)
{
if (m_pArr[i] == value)
{
nPos = i;
break;
}
}
return nPos;
}
int DynamicArray::findValueByPosArray(size_t pos)
{
if (m_pArr == nullptr)
{
return -1;
}
if (pos < 0 || pos >= m_size)
{
return -1;
}
return m_pArr[pos];
}
void DynamicArray::reclaimSpaceArray()
{
if (m_size == m_capacity)
{
int *newArr = new int[m_capacity * 2];
if (newArr == nullptr)
{
cout << "new 開辟空間失敗" << endl;
return;
}
memset(newArr, 0, m_capacity * 2 * sizeof(int));//第三個參數(shù)為字節(jié)數(shù)
memcpy(newArr, m_pArr, m_size * sizeof(int));//第三個參數(shù)為字節(jié)數(shù)
//下面這種逐個賦值的方式也可以使用
//for (size_t i = 0; i < m_capacity; i++)
//{
// newArr[i] = m_pArr[i];
//}
m_capacity = m_capacity * 2;
if (m_pArr) {
delete[] m_pArr;
m_pArr = nullptr;
}
m_pArr = newArr;
}
}
void DynamicArray::clearArray()//vector中clear()只是改變size的大小
{
m_size = 0;
}
int DynamicArray::getCapacity()
{
return m_capacity;
}
int DynamicArray::getCount()
{
return m_size;
}
void DynamicArray::printArray()
{
for (size_t i = 0; i < m_size; ++i)
{
//下面兩種方式打印都可以
cout << m_pArr[i] << " ";
//int ret = findValueByPosArray(i);
//cout<< ret<< " ";
}
cout << endl;
}
main.cpp
#include <iostream>
#include "DynamicArray.h"
using namespace std;
void test() {
DynamicArray * pArray = new DynamicArray;
int i = 0;
while (i++ < 11)
{
pArray->push_back_Array(i);
}
pArray->printArray();
cout <<"size= "<< pArray->getCount() << endl;
cout << "容量: " << pArray->getCapacity() << endl;
pArray->insertValueByPosArray(5,12);
pArray->printArray();
cout << "insert after size= " << pArray->getCount() << endl;
cout << "insert after 容量: " << pArray->getCapacity() << endl;
pArray->removeByValueFromArray(2);
pArray->printArray();
cout << "remove after size= " << pArray->getCount() << endl;
cout << "remove after 容量: " << pArray->getCapacity() << endl;
pArray->removeByPosFromArray(3);
pArray->printArray();
cout << "remove by pos after size= " << pArray->getCount() << endl;
cout << "remove by pos after 容量: " << pArray->getCapacity() << endl;
cout<<"find 2 of pos: "<<pArray->findPosByValueArray(2)<<endl;
cout << "find 8 of pos: " << pArray->findPosByValueArray(8) << endl;
cout << "value at pos of 6: " << pArray->findValueByPosArray(6) << endl;
pArray->clearArray();
cout << "size= " << pArray->getCount() << endl;
cout << "容量: " << pArray->getCapacity() << endl;
if (pArray)
{
delete pArray;
pArray = nullptr;
}
}
int main()
{
test();
return 0;
}
運(yùn)行環(huán)境
以上代碼的運(yùn)行環(huán)境為:vs2017控制臺輸出程序。
運(yùn)行效果
以上僅供記錄。可幫助理解vector。
原文鏈接:https://blog.csdn.net/blqzj214817/article/details/125315822
相關(guān)推薦
- 2022-01-18 正則——16進(jìn)制顏色
- 2022-06-18 C語言?詳解字符串基礎(chǔ)_C 語言
- 2022-07-07 C++如何將二叉搜索樹轉(zhuǎn)換成雙向循環(huán)鏈表(雙指針或數(shù)組)_C 語言
- 2022-08-10 C++示例講解friend?static?const關(guān)鍵字的用法_C 語言
- 2022-05-11 垃圾收集器ParNew&CMS與底層三色標(biāo)記算法詳解
- 2022-08-17 Win2008系統(tǒng)搭建DHCP服務(wù)器_win服務(wù)器
- 2022-06-01 Python基于Pytorch的特征圖提取實(shí)例_python
- 2022-05-21 ASP.NET?MVC中_ViewStart.cshtml作用介紹_基礎(chǔ)應(yīng)用
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支