Bagikan melalui


CArray Kelas

Mendukung array yang seperti array C, tetapi dapat secara dinamis mengurangi dan tumbuh seperlunya.

Sintaks

template <class TYPE, class ARG_TYPE = const TYPE&>
class CArray : public CObject

Parameter

TYPE
Parameter templat yang menentukan jenis objek yang disimpan dalam array. TYPE adalah parameter yang dikembalikan oleh CArray.

ARG_TYPE
Parameter templat yang menentukan jenis argumen yang digunakan untuk mengakses objek yang disimpan dalam array. Seringkali referensi ke TYPE. ARG_TYPE adalah parameter yang diteruskan ke CArray.

Anggota

Konstruktor Publik

Nama Deskripsi
CArray::CArray Membuat array kosong.

Metode Publik

Nama Deskripsi
CArray::Add Menambahkan elemen ke akhir array; menumbuhkan array jika perlu.
CArray::Append Menambahkan array lain ke array; menumbuhkan array jika perlu
CArray::Copy Menyalin array lain ke array; menumbuhkan array jika perlu.
CArray::ElementAt Mengembalikan referensi sementara ke penunjuk elemen dalam array.
CArray::FreeExtra Membebaskan semua memori yang tidak digunakan di atas batas atas saat ini.
CArray::GetAt Mengembalikan nilai pada indeks tertentu.
CArray::GetCount Mendapatkan jumlah elemen dalam array ini.
CArray::GetData Memungkinkan akses ke elemen dalam array. Bisa jadi NULL.
CArray::GetSize Mendapatkan jumlah elemen dalam array ini.
CArray::GetUpperBound Mengembalikan indeks valid terbesar.
CArray::InsertAt Menyisipkan elemen (atau semua elemen dalam array lain) pada indeks tertentu.
CArray::IsEmpty Menentukan apakah array kosong.
CArray::RemoveAll Menghapus semua elemen dari array ini.
CArray::RemoveAt Menghapus elemen pada indeks tertentu.
CArray::SetAt Mengatur nilai untuk indeks tertentu; array tidak diizinkan untuk tumbuh.
CArray::SetAtGrow Mengatur nilai untuk indeks tertentu; menumbuhkan array jika perlu.
CArray::SetSize Mengatur jumlah elemen yang akan dimuat dalam array ini.

Operator Publik

Nama Deskripsi
operator[] Mengatur atau mendapatkan elemen pada indeks yang ditentukan.

Keterangan

Indeks array selalu dimulai pada posisi 0. Anda dapat memutuskan apakah akan memperbaiki batas atas atau mengaktifkan array untuk diperluas saat Anda menambahkan elemen melewati batas saat ini. Memori dialokasikan secara berdekatan dengan batas atas, bahkan jika beberapa elemen null.

Catatan

Sebagian besar metode yang mengubah ukuran CArray objek atau menambahkan elemen ke dalamnya digunakan memcpy_s untuk memindahkan elemen. Ini adalah masalah karena memcpy_s tidak kompatibel dengan objek apa pun yang mengharuskan konstruktor dipanggil. Jika item dalam CArray tidak kompatibel dengan memcpy_s, Anda harus membuat baru CArray dengan ukuran yang sesuai. Anda kemudian harus menggunakan CArray::Copy dan CArray::SetAt untuk mengisi array baru karena metode tersebut menggunakan operator penugasan alih-alih memcpy_s.

Seperti halnya array C, waktu akses untuk CArray elemen terindeks konstan dan tidak bergantung pada ukuran array.

Tip

Sebelum menggunakan array, gunakan SetSize untuk menetapkan ukurannya dan mengalokasikan memori untuk array tersebut. Jika Anda tidak menggunakan SetSize, menambahkan elemen ke array Anda menyebabkannya sering direalokasi dan disalin. Realokasi dan penyalinan yang sering tidak efisien dan dapat memfragmentasi memori.

Jika Anda memerlukan cadangan elemen individual dalam array, Anda harus mengatur kedalaman CDumpContext objek ke 1 atau lebih besar.

Fungsi anggota tertentu dari kelas ini memanggil fungsi pembantu global yang harus disesuaikan untuk sebagian besar penggunaan CArray kelas. Lihat topik Pembantu Kelas Koleksi di bagian Makro dan Global MFC.

Derivasi kelas array seperti derivasi daftar.

Untuk informasi selengkapnya tentang cara menggunakan CArray, lihat artikel Koleksi.

Hierarki Warisan

CObject

CArray

Persyaratan

Header: afxtempl.h

CArray::Add

Menambahkan elemen baru ke akhir array, menumbuhkan array sebesar 1.

INT_PTR Add(ARG_TYPE newElement);

Parameter

ARG_TYPE
Parameter templat yang menentukan jenis elemen referensi argumen dalam array ini.

newElement
Elemen yang akan ditambahkan ke array ini.

Tampilkan Nilai

Indeks elemen yang ditambahkan.

Keterangan

Jika SetSize telah digunakan dengan nilai yang nGrowBy lebih besar dari 1, maka memori tambahan dapat dialokasikan. Namun, batas atas hanya akan meningkat 1.

Contoh

// example for CArray::Add
CArray<CPoint, CPoint> ptArray;

CPoint pt(10, 20);
ptArray.Add(pt);             // Element 0
ptArray.Add(CPoint(30, 40)); // Element 1

CArray::Append

Panggil fungsi anggota ini untuk menambahkan konten satu array ke ujung array lainnya.

INT_PTR Append(const CArray& src);

Parameter

src
Sumber elemen yang akan ditambahkan ke array.

Tampilkan Nilai

Indeks elemen pertama yang ditambahkan.

Keterangan

Array harus berjenis yang sama.

Jika perlu, Append dapat mengalokasikan memori tambahan untuk mengakomodasi elemen yang ditambahkan ke array.

Contoh

CArray<CPoint, CPoint> myArray1, myArray2;

// Add elements to the second array.
myArray2.Add(CPoint(11, 22));
myArray2.Add(CPoint(12, 42));

// Add elements to the first array and also append the second array.
myArray1.Add(CPoint(1, 2));
myArray1.Append(myArray2);

CArray::CArray

Membuat array kosong.

CArray();

Keterangan

Array menumbuhkan satu elemen pada satu waktu.

Contoh

CArray<CPoint, CPoint> ptArray;

CArray::Copy

Gunakan fungsi anggota ini untuk menyalin elemen dari satu array ke array lainnya.

void Copy(const CArray& src);

Parameter

src
Sumber elemen yang akan disalin ke array.

Keterangan

Panggil fungsi anggota ini untuk menimpa elemen satu array dengan elemen array lain.

Copy tidak membebaskan memori; namun, jika perlu, Copy dapat mengalokasikan memori tambahan untuk mengakomodasi elemen yang disalin ke array.

Contoh

CArray<CPoint, CPoint> myArray1, myArray2;

// Add elements to the second array.
myArray2.Add(CPoint(11, 22));
myArray2.Add(CPoint(12, 42));

// Copy the elements from the second array to the first.
myArray1.Copy(myArray2);

CArray::ElementAt

Mengembalikan referensi sementara ke elemen yang ditentukan dalam array.

TYPE& ElementAt(INT_PTR nIndex);
const TYPE& ElementAt(INT_PTR nIndex) const;

Parameter

nIndex
Indeks bilangan bulat yang lebih besar dari atau sama dengan 0 dan kurang dari atau sama dengan nilai yang dikembalikan oleh GetUpperBound.

Tampilkan Nilai

Referensi ke elemen array.

Keterangan

Ini digunakan untuk mengimplementasikan operator penugasan sisi kiri untuk array.

Contoh

Lihat contoh untuk GetSize.

CArray::FreeExtra

Membebaskan memori tambahan yang dialokasikan saat array tumbuh.

void FreeExtra();

Keterangan

Fungsi ini tidak berpengaruh pada ukuran atau batas atas array.

Contoh

Lihat contoh untuk GetData.

CArray::GetAt

Mengembalikan elemen array pada indeks yang ditentukan.

TYPE& GetAt(INT_PTR nIndex);
const TYPE& GetAt(INT_PTR nIndex) const;

Parameter

TYPE
Parameter templat yang menentukan jenis elemen array.

nIndex
Indeks bilangan bulat yang lebih besar dari atau sama dengan 0 dan kurang dari atau sama dengan nilai yang dikembalikan oleh GetUpperBound.

Tampilkan Nilai

Elemen array saat ini pada indeks ini.

Keterangan

Meneruskan nilai negatif atau nilai yang lebih besar dari nilai yang dikembalikan oleh GetUpperBound akan mengakibatkan pernyataan gagal.

Contoh

CArray<CPoint, CPoint> myArray;
CPoint pt;

// Add elements to the array.
for (int i = 0; i < 10; i++)
{
   myArray.Add(CPoint(i, 2 * i));
}

// Modify all the points in the array.
for (int i = 0; i <= myArray.GetUpperBound(); i++)
{
   pt = myArray.GetAt(i);
   pt.x = 0;
   myArray.SetAt(i, pt);
}

CArray::GetCount

Mengembalikan jumlah elemen array.

INT_PTR GetCount() const;

Tampilkan Nilai

Jumlah item dalam array.

Keterangan

Panggil metode ini untuk mengambil jumlah elemen dalam array. Karena indeks berbasis nol, ukurannya 1 lebih besar dari indeks terbesar. Memanggil metode ini akan menghasilkan hasil yang sama dengan CArray::GetSize metode .

Contoh

CArray<CPoint, CPoint> myArray;

// Add elements to the array.
for (int i = 0; i < 10; i++)
   myArray.Add(CPoint(i, 2 * i));

// Modify all the points in the array.
for (int i = 0; i < myArray.GetCount(); i++)
{
   CPoint &pt = myArray.ElementAt(i);
   pt.x = 0;
}

CArray::GetData

Gunakan fungsi anggota ini untuk mendapatkan akses langsung ke elemen dalam array.

const TYPE* GetData() const;
TYPE* GetData();

Parameter

TYPE
Parameter templat yang menentukan jenis elemen array.

Tampilkan Nilai

Penunjuk ke elemen array.

Keterangan

Jika tidak ada elemen yang tersedia, GetData mengembalikan nilai null.

Meskipun akses langsung ke elemen array dapat membantu Anda bekerja lebih cepat, berhati-hatilah saat memanggil GetData; kesalahan apa pun yang Anda buat secara langsung memengaruhi elemen array Anda.

Contoh

CArray<CPoint, CPoint> myArray;

// Allocate memory for at least 32 elements.
myArray.SetSize(32, 128);

// Add elements to the array.
CPoint *pPt = (CPoint *)myArray.GetData();
for (int i = 0; i < 32; i++, pPt++)
{
   *pPt = CPoint(i, 2 * i);
}

// Only keep first 5 elements and free extra (unused) bytes.
myArray.SetSize(5, 128);
myArray.FreeExtra();

#if _DEBUG
afxDump.SetDepth(1);
afxDump << "myArray: " << &myArray << "\n";
#endif

CArray::GetSize

Mengembalikan ukuran array.

INT_PTR GetSize() const;

Keterangan

Karena indeks berbasis nol, ukurannya 1 lebih besar dari indeks terbesar. Memanggil metode ini akan menghasilkan hasil yang sama dengan CArray::GetCount metode .

Contoh

CArray<CPoint, CPoint> myArray;

// Add elements to the array.
for (int i = 0; i < 10; i++)
   myArray.Add(CPoint(i, 2 * i));

// Modify all the points in the array.
for (int i = 0; i < myArray.GetSize(); i++)
{
   CPoint &pt = myArray.ElementAt(i);
   pt.x = 0;
}

CArray::GetUpperBound

Mengembalikan batas atas array ini saat ini.

INT_PTR GetUpperBound() const;

Keterangan

Karena indeks array berbasis nol, fungsi ini mengembalikan nilai 1 kurang dari GetSize.

Kondisi GetUpperBound( ) = -1 menunjukkan bahwa array tidak berisi elemen.

Contoh

Lihat contoh untuk CArray::GetAt.

CArray::InsertAt

Versi InsertAt pertama menyisipkan satu elemen (atau beberapa salinan elemen) pada indeks tertentu dalam array.

void InsertAt(
    INT_PTR nIndex,
    ARG_TYPE newElement,
    INT_PTR nCount = 1);

void InsertAt(
    INT_PTR nStartIndex,
    CArray* pNewArray);

Parameter

nIndex
Indeks bilangan bulat yang mungkin lebih besar dari nilai yang dikembalikan oleh GetUpperBound.

ARG_TYPE
Parameter templat yang menentukan jenis elemen dalam array ini.

newElement
Elemen yang akan ditempatkan dalam array ini.

nCount
Frekuensi elemen ini harus disisipkan (default ke 1).

nStartIndex
Indeks bilangan bulat yang mungkin lebih besar dari nilai yang dikembalikan oleh GetUpperBound.

pNewArray
Array lain yang berisi elemen yang akan ditambahkan ke array ini.

Keterangan

Dalam prosesnya, ia bergeser ke atas (dengan meningkatkan indeks) elemen yang ada pada indeks ini, dan menggeser semua elemen di atasnya.

Versi kedua menyisipkan semua elemen dari koleksi lain CArray , dimulai dari nStartIndex posisi.

Fungsi ini SetAt , sebaliknya, menggantikan satu elemen array yang ditentukan dan tidak menggeser elemen apa pun.

Contoh

// example for CArray::InsertAt

CArray<CPoint, CPoint> ptArray;

ptArray.Add(CPoint(10, 20));         // Element 0
ptArray.Add(CPoint(30, 40));         // Element 1 (will become element 2)
ptArray.InsertAt(1, CPoint(50, 60)); // New element 1

CArray::IsEmpty

Menentukan apakah array kosong.

BOOL IsEmpty() const;

Tampilkan Nilai

Bukan nol jika array tidak berisi elemen; jika tidak, 0.

CArray::operator []

Operator subskrip ini adalah pengganti SetAt fungsi dan GetAt yang nyaman.

TYPE& operator[](int_ptr nindex);
const TYPE& operator[](int_ptr nindex) const;

Parameter

TYPE
Parameter templat yang menentukan jenis elemen dalam array ini.

nIndex
Indeks elemen yang akan diakses.

Keterangan

Operator pertama, yang dipanggil untuk array yang bukan const, dapat digunakan di kanan (r-value) atau kiri (nilai l) dari pernyataan penugasan. Yang kedua, yang dipanggil untuk const array, hanya dapat digunakan di sebelah kanan.

Versi Debug pustaka menegaskan jika subskrip (baik di sisi kiri atau kanan pernyataan penugasan) berada di luar batas.

Contoh

CArray<CPoint, CPoint> myArray;

// Add elements to the array.
for (int i = 0; i < 10; i++)
{
   myArray.Add(CPoint(i, 2 * i));
}

// Modify all the points in the array.
for (int i = 0; i <= myArray.GetUpperBound(); i++)
{
   myArray[i].x = 0;
}

CArray::RelocateElements

Merelokasi data ke buffer baru saat array harus tumbuh atau menyusut.

template<class TYPE, class ARG_TYPE>
AFX_INLINE void CArray<TYPE, ARG_TYPE>::RelocateElements(
    TYPE* pNewData,
    const TYPE* pData,
    INT_PTR nCount);

Parameter

pNewData
Buffer baru untuk array elemen.

pData
Array elemen lama.

nCount
Jumlah elemen dalam array lama.

Keterangan

pNewData selalu cukup besar untuk menampung semua pData elemen.

Implementasi CArray menggunakan metode ini untuk menyalin data lama ke buffer baru ketika array harus tumbuh atau menyusut (ketika SetSize atau FreeExtra dipanggil). Implementasi default hanya menyalin data.

Untuk array di mana elemen berisi penunjuk ke salah satu anggotanya sendiri, atau struktur lain berisi penunjuk ke salah satu elemen array, pointer tidak diperbarui dalam salinan biasa. Dalam hal ini, Anda dapat memperbaiki pointer dengan menerapkan spesialisasi RelocateElements dengan jenis yang relevan. Anda juga bertanggung jawab atas penyalinan data.

CArray::RemoveAll

Menghapus semua elemen dari array ini.

void RemoveAll();

Keterangan

Jika array sudah kosong, fungsi masih berfungsi.

Contoh

CArray<CPoint, CPoint> myArray;

// Add elements to the array.
for (int i = 0; i < 10; i++)
   myArray.Add(CPoint(i, 2 * i));

myArray.RemoveAll();

#ifdef _DEBUG
afxDump.SetDepth(1);
afxDump << "myArray: " << &myArray << "\n";
#endif

CArray::RemoveAt

Menghapus satu atau beberapa elemen yang dimulai pada indeks tertentu dalam array.

void RemoveAt(
    INT_PTR nIndex,
    INT_PTR nCount = 1);

Parameter

nIndex
Indeks bilangan bulat yang lebih besar dari atau sama dengan 0 dan kurang dari atau sama dengan nilai yang dikembalikan oleh GetUpperBound.

nCount
Jumlah elemen yang akan dihapus.

Keterangan

Dalam prosesnya, ia menggeser ke bawah semua elemen di atas elemen yang dihapus. Ini mengurangi batas atas array tetapi tidak membebaskan memori.

Jika Anda mencoba menghapus lebih banyak elemen daripada yang terkandung dalam array di atas titik penghapusan, maka versi Debug pustaka menegaskan.

Contoh

CArray<CPoint, CPoint> myArray;

// Add elements to the array.
for (int i = 0; i < 10; i++)
{
   myArray.Add(CPoint(i, 2 * i));
}

myArray.RemoveAt(5);

#ifdef _DEBUG
afxDump.SetDepth(1);
afxDump << "myArray: " << &myArray << "\n";
#endif

CArray::SetAt

Mengatur elemen array pada indeks yang ditentukan.

void SetAt(INT_PTR nIndex, ARG_TYPE newElement);

Parameter

nIndex
Indeks bilangan bulat yang lebih besar dari atau sama dengan 0 dan kurang dari atau sama dengan nilai yang dikembalikan oleh GetUpperBound.

ARG_TYPE
Parameter templat yang menentukan jenis argumen yang digunakan untuk mereferensikan elemen array.

newElement
Nilai elemen baru yang akan disimpan pada posisi yang ditentukan.

Keterangan

SetAt tidak akan menyebabkan array tumbuh. Gunakan SetAtGrow jika Anda ingin array tumbuh secara otomatis.

Anda harus memastikan bahwa nilai indeks Anda mewakili posisi yang valid dalam array. Jika berada di luar batas, maka versi Debug pustaka menegaskan.

Contoh

Lihat contoh untuk GetAt.

CArray::SetAtGrow

Mengatur elemen array pada indeks yang ditentukan.

void SetAtGrow(INT_PTR nIndex, ARG_TYPE newElement);

Parameter

nIndex
Indeks bilangan bulat yang lebih besar dari atau sama dengan 0.

ARG_TYPE
Parameter templat yang menentukan jenis elemen dalam array.

newElement
Elemen yang akan ditambahkan ke array ini. Nilai NULL diperbolehkan.

Keterangan

Array tumbuh secara otomatis jika perlu (yaitu, batas atas disesuaikan untuk mengakomodasi elemen baru).

Contoh

// example for CArray::SetAtGrow
CArray<CPoint, CPoint> ptArray;

ptArray.Add(CPoint(10, 20)); // Element 0
ptArray.Add(CPoint(30, 40)); // Element 1
// Element 2 deliberately skipped
ptArray.SetAtGrow(3, CPoint(50, 60)); // Element 3

CArray::SetSize

Menetapkan ukuran array kosong atau yang ada; mengalokasikan memori jika perlu.

void SetSize(
    INT_PTR nNewSize,
    INT_PTR nGrowBy = -1);

Parameter

nNewSize
Ukuran array baru (jumlah elemen). Harus lebih besar dari atau sama dengan 0.

nGrowBy
Jumlah minimum slot elemen untuk dialokasikan jika peningkatan ukuran diperlukan.

Keterangan

Jika ukuran baru lebih kecil dari ukuran lama, maka array dipotong dan semua memori yang tidak digunakan dilepaskan.

Gunakan fungsi ini untuk mengatur ukuran array Anda sebelum Anda mulai menggunakan array. Jika Anda tidak menggunakan SetSize, menambahkan elemen ke array Anda menyebabkannya sering direalokasi dan disalin. Realokasi dan penyalinan yang sering tidak efisien dan dapat memfragmentasi memori.

Parameter nGrowBy memengaruhi alokasi memori internal saat array tumbuh. Penggunaannya tidak pernah memengaruhi ukuran array seperti yang dilaporkan oleh GetSize dan GetUpperBound. Jika nilai default digunakan, MFC mengalokasikan memori dengan cara yang dihitung untuk menghindari fragmentasi memori dan mengoptimalkan efisiensi untuk sebagian besar kasus.

Contoh

Lihat contoh untuk GetData.

Lihat juga

Sampel MFC COLLECT
CObject Kelas
Bagan Hierarki
CObArray Kelas
Pembantu Kelas Koleksi