Bagikan melalui


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.

Diagram yang menunjukkan hierarki sifat untuk kelas koleksi.

Sampel Kelas Koleksi

Sampel berikut menunjukkan kelas koleksi:

Lihat juga

Konsep
Kelas Koleksi