Kelas Koleksi ATL
ATL menyediakan banyak kelas untuk menyimpan dan mengakses data. Kelas mana yang Anda putuskan untuk digunakan tergantung pada beberapa faktor, termasuk:
Jumlah data yang akan disimpan
Efisiensi versus performa dalam mengakses data
Kemampuan untuk mengakses data menurut indeks atau menurut kunci
Cara data diurutkan
Preferensi pribadi
Kelas Koleksi Kecil
ATL menyediakan kelas array berikut untuk menangani sejumlah kecil objek. Namun, kelas-kelas ini terbatas dan dirancang untuk digunakan secara internal oleh ATL. Tidak disarankan agar Anda menggunakannya dalam program Anda.
Kelas | Jenis penyimpanan data |
---|---|
CSimpleArray | Menerapkan kelas array untuk menangani sejumlah kecil objek. |
CSimpleMap | Menerapkan kelas pemetaan untuk menangani sejumlah kecil objek. |
Kelas Koleksi Tujuan Umum
Kelas berikut mengimplementasikan array, daftar, dan peta dan disediakan sebagai kelas pengumpulan tujuan umum:
Kelas | Jenis penyimpanan data |
---|---|
CAtlArray | Menerapkan array. |
CAtlList | Menerapkan daftar. |
CAtlMap | Menerapkan struktur pemetaan, di mana data dapat dirujuk oleh kunci atau nilai. |
CRBMap | Menerapkan struktur pemetaan menggunakan algoritma Red-Black. |
CRBMultiMap | Menerapkan struktur multimapping Red-Black. |
Kelas-kelas ini akan menjebak banyak kesalahan pemrograman ketika digunakan dalam build debug, tetapi demi performa, pemeriksaan ini tidak akan dilakukan dalam build ritel.
Kelas Koleksi Khusus
Kelas koleksi yang lebih khusus juga disediakan untuk mengelola pointer memori dan penunjuk antarmuka:
Kelas | Tujuan |
---|---|
CAutoPtrArray | Menyediakan metode yang berguna saat membuat array pointer pintar. |
CAutoPtrList | Menyediakan metode yang berguna saat membuat daftar penunjuk cerdas. |
CComUnkArray | IUnknown Menyimpan pointer dan dirancang untuk digunakan sebagai parameter ke kelas templat IConnectionPointImpl. |
CHeapPtrList | Menyediakan metode yang berguna saat membuat daftar penunjuk timbunan. |
CInterfaceArray | Menyediakan metode yang berguna saat membuat array penunjuk antarmuka COM. |
CInterfaceList | Menyediakan metode yang berguna saat membuat daftar penunjuk antarmuka COM. |
Memilih Kelas Koleksi
Setiap kelas koleksi yang tersedia menawarkan karakteristik performa yang berbeda, seperti yang ditunjukkan pada tabel di bawah ini.
Kolom 2 dan 3 menjelaskan karakteristik urutan dan akses setiap kelas. Dalam tabel, istilah "diurutkan" berarti bahwa urutan item disisipkan dan dihapus menentukan urutannya dalam koleksi; bukan berarti item diurutkan pada kontennya. Istilah "diindeks" berarti bahwa item dalam koleksi dapat diambil oleh indeks bilangan bulat, sama seperti item dalam array biasa.
Kolom 4 dan 5 menjelaskan performa setiap kelas. Dalam aplikasi yang membutuhkan banyak penyisipan ke dalam koleksi, kecepatan penyisipan mungkin sangat penting; untuk aplikasi lain, kecepatan pencarian mungkin lebih penting.
Kolom 6 menjelaskan apakah setiap bentuk memungkinkan elemen duplikat.
Performa operasi kelas koleksi tertentu dinyatakan dalam hal hubungan antara waktu yang diperlukan untuk menyelesaikan operasi dan jumlah elemen dalam koleksi. Operasi membutuhkan waktu yang meningkat secara linier saat jumlah elemen meningkat digambarkan sebagai algoritma O(n). Sebaliknya, operasi membutuhkan waktu yang meningkat lebih sedikit dan lebih sedikit karena jumlah elemen meningkat digambarkan sebagai algoritma O(log n). Oleh karena itu, dalam hal performa, algoritma O(log n) mengungguli algoritma O(n) semakin banyak seiring meningkatnya jumlah elemen.
Fitur Bentuk Koleksi
Bentuk | Dipesan | Diindeks | Sisipkan elemen |
Cari elemen yang ditentukan |
Duplikat elemen |
---|---|---|---|---|---|
List | Ya | Tidak | Cepat (waktu konstanta) | O Lambat(n) | Ya |
Array | Ya | Menurut int (waktu konstanta) | O(n) lambat kecuali jika menyisipkan pada akhirnya, dalam hal ini waktu konstanta | O Lambat(n) | Ya |
Peta | No | Menurut kunci (waktu konstanta) | Cepat (waktu konstanta) | Cepat (waktu konstanta) | Tidak (kunci) Ya (nilai) |
Peta Merah-Hitam | Ya (menurut kunci) | Menurut key O(log n) | Fast O(log n) | Fast O(log n) | No |
Multimap Merah-Hitam | Ya (menurut kunci) | Menurut key O(log n) (beberapa nilai per kunci) | Fast O(log n) | Fast O(log n) | Ya (beberapa nilai per kunci) |
Menggunakan Objek CTraits
Karena kelas koleksi ATL dapat digunakan untuk menyimpan berbagai jenis data yang ditentukan pengguna, dapat berguna untuk dapat mengambil alih fungsi penting seperti perbandingan. Ini dicapai menggunakan kelas CTraits.
Kelas CTraits mirip dengan, tetapi lebih fleksibel daripada, fungsi pembantu kelas koleksi MFC; lihat Pembantu Kelas Koleksi untuk informasi selengkapnya.
Saat membuat kelas koleksi, Anda memiliki opsi untuk menentukan kelas CTraits. Kelas ini akan berisi kode yang akan melakukan operasi seperti perbandingan ketika dipanggil oleh metode lain yang membentuk kelas koleksi. Misalnya, jika objek daftar Anda berisi struktur yang ditentukan pengguna Anda sendiri, Anda mungkin ingin menentukan ulang pengujian kesetaraan untuk hanya membandingkan variabel anggota tertentu. Dengan cara ini, metode Temukan objek daftar akan beroperasi dengan cara yang lebih berguna.
Contoh
Kode
// Collection class / traits class example.
// This program demonstrates using a CTraits class
// to create a new comparison operator.
#define MAX_STRING 80
// Define our own data type to store in the list.
struct MyData
{
int ID;
TCHAR name[MAX_STRING];
TCHAR address[MAX_STRING];
};
// Define our own traits class, making use of the
// existing traits and overriding only the comparison
// we need.
class MyTraits : public CElementTraits< MyData >
{
public:
// Override the comparison to only compare
// the ID value.
static bool CompareElements(const MyData& element1, const MyData& element2)
{
if (element1.ID == element2.ID)
return true;
else
return false;
};
};
void DoAtlCustomTraitsList()
{
// Declare the array, with our data type and traits class
CAtlList < MyData, MyTraits > MyList;
// Create some variables of our data type
MyData add_item, search_item;
// Add some elements to the list.
add_item.ID = 1;
_stprintf_s(add_item.name, _T("Rumpelstiltskin"));
_stprintf_s(add_item.address, _T("One Grimm Way"));
MyList.AddHead(add_item);
add_item.ID = 2;
_stprintf_s(add_item.name, _T("Rapunzel"));
_stprintf_s(add_item.address, _T("One Grimm Way"));
MyList.AddHead(add_item);
add_item.ID = 3;
_stprintf_s(add_item.name, _T("Cinderella"));
_stprintf_s(add_item.address, _T("Two Grimm Way"));
MyList.AddHead(add_item);
// Create an element which will be used
// to search the list for a match.
search_item.ID = 2;
_stprintf_s(search_item.name, _T("Don't care"));
_stprintf_s(search_item.address, _T("Don't care"));
// Perform a comparison by searching for a match
// between any element in the list, and our
// search item. This operation will use the
// (overridden) comparison operator and will
// find a match when the IDs are the same.
POSITION i;
i = MyList.Find(search_item);
if (i != NULL)
_tprintf_s(_T("Item found!\n"));
else
_tprintf_s(_T("Item not found.\n"));
}
Komentar
Untuk daftar kelas CTraits, lihat Kelas Koleksi.
Diagram berikut menunjukkan hierarki kelas untuk kelas CTraits.
Sampel Kelas Koleksi
Sampel berikut menunjukkan kelas koleksi: