34 動態陣列

2021-08-29 02:43:03 字數 2598 閱讀 2513

new和delete運算子一次只分配/釋放乙個物件,但是某些應用需要以此為很多物件分配記憶體的功能。

c++中制定了兩種分配/釋放多個物件的機制!分別是:new/delete  和 allocator類。

其中new/delete 再分配記憶體的時候就初始化物件;

allocator類將記憶體的分配和物件的初始化分離。

類似於預載入和懶載入。

new的初始化

int * p = new int[get_size()];

int * q = new int[100];//預設初始化,100個未初始化的int

int * s = new int[100](); //值初始化,100個0

int * m = new int[10]; //1,2,3,4,5,6,7,8,9,0(0是值初始化)

花括號列表形式的初始化器用來初始化動態陣列的開始部分元素。如果初始化器給出的元素大於總的元素數目,則new表達是會出錯,不會分配任何記憶體。當小於總的元素數目的時候,後面的剩餘元素將會進行值初始化。

delete 釋放動態陣列

typedef arrt[100] int ;

int * p = new arrt;

delete p;

當我們釋放乙個指向陣列的指標的時候,空括號是必須的。因為:它指示編譯器此指標指向乙個物件陣列的第乙個元素!如果我們忽略了方括號,其行為是未定義的。

陣列的元素的銷毀是逆序的。最後乙個元素首先被銷毀,然後是倒數第二個,以此類推。

unique_ptr

unique_ptrp(new int[100]());  //分配

p.reset() ; //釋放

unique_ptr使用下標訪問陣列中的元素

unique_ptrup(new int[10]);

for(size_t i = 0;i != 10;i++)

shared_ptr 未定義下標運算子,不能通過下標來訪問陣列元素。因此是不支援管理乙個動態陣列的。但是如果我們需要進行這種操作就必須要給它傳遞乙個刪除器;

shared_ptrsp(new int[10],(int* p));

sp.reset(); // 使用lambda作為刪除器,釋放陣列

shared_ptr  使用get()訪問陣列元素;

for(size_t i = 0;i != 10;++i)

allocator類    primer p428

其實很簡單,將記憶體的建立+物件的構造分離開來;也就是將 物件的析構+記憶體的釋放分離開來!

記憶體建立:allocate()然後返回第乙個元素的起始位址

物件的構造:construct()   引數一 位置指標,引數二 物件

物件的析構:destory()  傳遞指標

記憶體釋放:deallocate()  //傳遞給deallocate的指標必須是之前某次allocate返回的指標,因此在deallocate之前我們必須要檢查該指標是否為空

舉個栗子:

#include #include using namespace std;

class animal

#endif

animal(int _num) : num(_num)

~animal()

void show()

private:

int num;

};int main()

//物件銷毀之後還可以繼續構建,因為構建和記憶體的分配是分離的

//6.

alloc.deallocate(a, 5);

cin.get();

return 0;

}

輸出

animal constructor param

animal constructor default

animal constructor param

animal constructor default

animal constructor param10

305animal destructor

animal destructor

animal destructor

animal destructor

animal destructor

3 4 陣列的拷貝函式

函式arraycopy src,srcpos,dest,destpos,length 呼叫方法 system.arraycopy src,srcpos,dest,destpos,length 利用陣列拷貝方法實現簡易的陣列刪除元素,陣列擴容,向陣列中插入元素這三個功能。利用陣列拷貝,實現陣列刪除元素...

3 4 多陣列中位數

題目描述 給定兩個有序陣列arr1和arr2,兩個陣列長度都為n,求兩個陣列中所有數的上中位數。例如 arr1 arr2 一共8個數則上中位數是第4個數,所以返回3。arr1 arr2 一共6個數則上中位數是第3個數,所以返回2。要求 時間複雜度o logn 1 2 思路 二分思路 3首先分別找出兩...

usaco 3 4 rockers 動態規劃

f disk song ti 表示用前disk張光碟,錄製前song首歌曲 不一定錄製第song首歌曲 的最大曲目數,並且當前在錄的光碟剩餘時間是ti f disk song ti max f disk song 1 ti f disk 1 song 1 t a song disk 1 a song...