1. 程式人生 > >c++筆記之CArray函式

c++筆記之CArray函式

謹以此文獻給因為我菜雞同時裝了VS2013和2017導致vs各種衝突,以至於只能重灌系統的新電腦!哭泣....

CArray屬於MFC,是一個數組模板類。MFC的陣列類支援的陣列類似於常規陣列,可以存放任何資料型別。常規陣列在使用前必須將其定義成能夠容納所有可能需要的元素,即先確定大小,而MFC陣列類建立的物件可以根據需要動態地增大或減小,陣列的起始下標是0,而上限可以是固定的,也可以隨著元素的增加而增加,陣列在記憶體中的地址仍然是連續分配的。但是宣告一個carray陣列必須是確定陣列長度,可以之後隨元素增加而增加。

使用CArray要新增一個頭檔案#include <afxtempl.h>

#include "stdafx.h"
#include <iostream>
#include<fstream>
#include <afxtempl.h>
using namespace std;

void plusA(CArray<int, int>&b, int d)
{
    //int n=10;
    int n = b.GetSize();
    for (int i = 0; i<10; i++)
        b[i] = b[i] + d;
    cout << &b[0] << endl;
    cout << &d << endl;
}

int main()
{
    int n = 10;
    int c = 2;
    CArray<int, int> arr;
    arr.SetSize(n, n);  //設定陣列長度;
    for (int i = 0; i < 10; i++)
        arr.SetAt(i, 2 * i);
    for (int i = 0; i<10; i++)
        cout << arr[i] << ' ';
    cout << endl;

    cout << &arr[0] << endl;
    cout << &c << endl;
    plusA(arr, c);
    system("pause");
    return 0;
}
  • 定義一個CArray陣列物件CArray<int, int> arr;第一個引數為陣列元素的型別,第二個引數為int型別,一般有兩種選擇,一種選擇與第一個引數型別相同,它意味著陣列物件作為引數傳遞時,傳遞的是陣列物件。第二種選擇是第一個引數型別的引用,它意味著陣列物件作為引數傳遞時,傳遞的是陣列物件的指標,這種方法效率更高。
  • SetSize函式設定陣列的大小,該函式有兩個引數,第一個引數設定陣列的大小;第二個引數設定陣列增長時記憶體分配的大小,預設值是-1,使用預設值可以保證記憶體分配得更加合理。本例中第二個引數是n,意即增加一個數組元素會分配n個元素大小的記憶體供陣列使用。 可以隨時使用SetSize函式設定陣列的大小,如果第一個引數值小於陣列已有成員數量,多於第一個引數值的成員將被截去並釋放相應記憶體。在使用CArray陣列前,最好先使用SetSize確定其大小並申請儲存空間。如果不這樣做,向陣列中增加元素時,需要不斷地移動和拷貝元素造成執行的低效率和記憶體碎塊。
  • SetAt方法初始化陣列元素,void SetAt( int n, ARG_TYPE newElement );將第n的元素的值設定成newElement.

一些基本函式:

CArray::GetSize 
int GetSize( ) const;
取得當前陣列元素個數.

CArray::GetUpperBound 
int GetUpperBound( ) const;
最得最大的元素的索引,由於C的陣列是從0開始,所以此函式的返回值比GetSize的返回值比 小.

CArray::SetSize 
void SetSize( int nNewSize, int nGrowBy = -1 );
throw( CMemoryException );
設定陣列的大小.

CArray::FreeExtra 
void FreeExtra( );
釋放未使用的空間.

CArray::RemoveAll 
void RemoveAll( );
刪除所有的元素.

CArray::GetAt 
TYPE GetAt( int nIndex ) const;
根據索引(引數)取得某個陣列元素的值.

CArray::SetAt 
void SetAt( int nIndex, ARG_TYPE newElement );
將第nIndex的元素的值設定成newElement.

CArray::ElementAt 
TYPE& ElementAt( int nIndex );
取得第nIndex個元素的引用.

CArray::GetData
const TYPE* GetData( ) const;
TYPE* GetData( );
取得靜態陣列指標.

void SetAtGrow( int nIndex, ARG_TYPE newElement );
throw( CMemoryException );
將第nIndex個元素設定成newElement,如果陣列元素不夠,會增加空間.

CArray::Add 
int Add( ARG_TYPE newElement );
throw( CMemoryException );
增加一個元素.

CArray::Append
int Append( const CArray& src );
將另一個數組追加過來.

void Copy( const CArray& src );
複製陣列,已經內容將會被覆蓋.

CArray::InsertAt 
void InsertAt( int nIndex, ARG_TYPE newElement, int nCount = 1 );
throw( CMemoryException );
void InsertAt( int nStartIndex, CArray* pNewArray );
throw( CMemoryException );
插入一個元素(或另一個數組)到陣列.

CArray::RemoveAt 
void RemoveAt( int nIndex, int nCount = 1 );
刪除另一個元素.

CArray::operator [ ] 
TYPE& operator []( int nIndex );
TYPE operator []( int nIndex ) const;
通過索引設定或取得另一個元素.

 

還有因為涉及MFC所以VS使用的時候要改一下設定!

MFC使用哪裡要改成在靜態庫中使用MFC!

 

 

在此感謝我的良師諍友--小樊...

我的進步有你的功勞!