Aracılığıyla paylaş


ATL Koleksiyon Sınıfları

Uyarı

Etkin Şablon Kitaplığı (ATL) desteklenmeye devam eder. Ancak artık özellik eklemeyeceğiz veya belgeleri güncelleştirmeyeceğiz.

ATL, verileri depolamak ve verilere erişmek için birçok sınıf sağlar. Hangi sınıfı kullanmaya karar vereceğiniz aşağıdakiler gibi çeşitli faktörlere bağlıdır:

  • Depolanacak veri miktarı

  • Verilere erişimde verimlilik ve performans karşılaştırması

  • Verilere dizine veya anahtara göre erişme olanağı

  • Veriler nasıl sıralanır?

  • Kişisel tercih

Küçük Koleksiyon Sınıfları

ATL, az sayıda nesneyle ilgilenmek için aşağıdaki dizi sınıflarını sağlar. Ancak, bu sınıflar sınırlı ve ATL tarafından dahili olarak kullanılmak üzere tasarlanmıştır. Bunları programlarınızda kullanmanız önerilmez.

Sınıf Veri depolama türü
CSimpleArray Az sayıda nesneyle ilgilenmek için bir dizi sınıfı uygular.
CSimpleMap Az sayıda nesneyle ilgilenmek için bir eşleme sınıfı uygular.

Genel Amaçlı Koleksiyon Sınıfları

Aşağıdaki sınıflar diziler, listeler ve haritalar uygular ve genel amaçlı koleksiyon sınıfları olarak sağlanır:

Sınıf Veri depolama türü
CAtlArray Bir diziyi uygular.
CAtlList Bir liste uygular.
CAtlMap Verilere anahtar veya değer tarafından başvurulabildiği bir eşleme yapısı uygular.
CRBMap Kırmızı-Siyah algoritmasını kullanarak bir eşleme yapısı uygular.
CRBMultiMap Kırmızı-Siyah çoklu eşleme yapısı uygular.

Bu sınıflar hata ayıklama derlemelerinde kullanıldığında birçok programlama hatasını yakalar, ancak performans açısından bu denetimler perakende derlemelerinde gerçekleştirilmeyecektir.

Özel Koleksiyon Sınıfları

Bellek işaretçilerini ve arabirim işaretçilerini yönetmek için daha özel koleksiyon sınıfları da sağlanır:

Sınıf Amaç
CAutoPtrArray Akıllı işaretçi dizisi oluştururken yararlı yöntemler sağlar.
CAutoPtrList Akıllı işaretçilerin listesini oluştururken yararlı yöntemler sağlar.
CComUnkArray IUnknown işaretçilerini depolar ve IConnectionPointImpl şablon sınıfı için parametre olarak kullanılmak üzere tasarlanmıştır.
CHeapPtrList Yığın işaretçilerinin listesini oluştururken yararlı yöntemler sunar.
CInterfaceArray COM arabirim işaretçileri dizisi oluştururken yararlı yöntemler sağlar.
CInterfaceList COM arabirim işaretçilerinin listesini oluştururken yararlı yöntemler sağlar.

Koleksiyon Sınıfı Seçme

Aşağıdaki tabloda gösterildiği gibi kullanılabilir koleksiyon sınıflarının her biri farklı performans özellikleri sunar.

  • 2. ve 3. sütunlarda her sınıfın sıralama ve erişim özellikleri açıklanmaktadır. Tabloda "sıralı" terimi, öğelerin eklendiği ve silindiği sıranın koleksiyondaki sıralarını belirlediği anlamına gelir; bu, öğelerin içeriklerine göre sıralandığı anlamına gelmez. "Dizinli" terimi, koleksiyondaki öğelerin tipik bir dizideki öğelere çok benzer bir tamsayı dizini tarafından alınabileceği anlamına gelir.

  • 4. ve 5. sütunlar her sınıfın performansını açıklar. Koleksiyona çok sayıda ekleme gerektiren uygulamalarda ekleme hızı özellikle önemli olabilir; diğer uygulamalar için arama hızı daha önemli olabilir.

  • 6. sütun, her şeklin yinelenen öğelere izin verip vermeyeceğini açıklar.

  • Belirli bir koleksiyon sınıfı işleminin performansı, işlemi tamamlamak için gereken süre ile koleksiyondaki öğe sayısı arasındaki ilişki açısından ifade edilir. Öğe sayısı arttıkça doğrusal olarak artan bir süre alan bir işlem bir O(n) algoritması olarak tanımlanır. Buna karşılık, öğe sayısı arttıkça daha az ve daha az zaman alan bir işlem O(log n) algoritması olarak tanımlanır. Bu nedenle, performans açısından O(log n) algoritmaları, öğe sayısı arttıkça O(n) algoritmalarından daha fazla performans gösterir.

Koleksiyon Şekli Özellikleri

Şekil Sipariş edilen Endekslenmiş Ekleme

öğesi
Şunu ara:

belirtilen öğe
Yinele

öğeler
Liste Evet Hayır Hızlı (sabit süre) Yavaş O(n) Evet
Dizi Evet Int (sabit süre) ile Sonda ekleme işlemi dışında yavaş O(n) ve bu durumda sabit süre Yavaş O(n) Evet
Harita Hayır Tuşa göre (sabit saat) Hızlı (sabit süre) Hızlı (sabit süre) Hayır (anahtarlar) Evet (değerler)
Kırmızı-Siyah Harita Evet (tuşa göre) Anahtara göre O(log n) Hızlı O(logaritmik n) Hızlı O(log n) Hayır
Kırmızı-Siyah Çoklu Harita Evet (tuşa göre) Anahtara göre O(log n) (anahtar başına birden çok değer) Hızlı O(log n) Hızlı O(log n) Evet (anahtar başına birden çok değer)

CTraits Nesnelerini Kullanma

ATL koleksiyonu sınıfları çok çeşitli kullanıcı tanımlı veri türlerini depolamak için kullanılabildiğinden, karşılaştırmalar gibi önemli işlevleri geçersiz kılmak yararlı olabilir. Bu, CTraits sınıfları kullanılarak elde edilir.

CTraits sınıfları, MFC koleksiyon sınıfı yardımcı işlevlerine benzer, ancak daha esnektir; Daha fazla bilgi için bkz . Koleksiyon Sınıfı Yardımcıları .

Koleksiyon sınıfınızı oluştururken bir CTraits sınıfı belirtme seçeneğiniz vardır. Bu sınıf, koleksiyon sınıfını oluşturan diğer yöntemler tarafından çağrıldığında karşılaştırmalar gibi işlemler gerçekleştirecek kodu içerir. Örneğin, liste nesneniz kendi kullanıcı tanımlı yapılarınızı içeriyorsa, yalnızca belirli üye değişkenlerini karşılaştırmak için eşitlik testini yeniden tanımlamak isteyebilirsiniz. Bu şekilde, liste nesnesinin Find yöntemi daha kullanışlı bir şekilde çalışır.

Örnek

Kod

// 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"));
}

Açıklamalar

CTraits sınıflarının listesi için bkz . Koleksiyon Sınıfları.

Aşağıdaki diyagramda CTraits sınıfları için sınıf hiyerarşisi gösterilmektedir.

Koleksiyon sınıfları için özellik hiyerarşisini gösteren diyagram.

Koleksiyon Sınıfları Örnekleri

Aşağıdaki örnekler koleksiyon sınıflarını gösterir:

Ayrıca bkz.

Kavramlar
Koleksiyon Sınıfları