Udostępnij za pośrednictwem


Dostęp do wszystkich członków kolekcji

Klasy MFC tablicę kolekcji — zarówno oparty na szablonie i nie — dostęp ich elementów za pomocą indeksów.Klasy MFC listy i mapy kolekcji — zarówno oparty na szablonie i nie — użyj wskaźnika typu stanowisko do opisania danej pozycji w kolekcji.Uzyskać dostęp do jednego lub więcej członków tych zbiorów, należy najpierw zainicjować wskaźnik położenia wielokrotnie przekazania tej pozycji do zbierania i poproś go, aby powrócić do następnego elementu.Kolekcja nie jest odpowiedzialny za utrzymywanie stanu informacji o postępie iteracji.Te informacje są przechowywane w wskaźnik położenia.Jednak biorąc pod uwagę szczególne położenie, Kolekcja jest odpowiedzialny za zwrócenie następnego elementu.

Poniższe procedury przedstawiają iteracyjne trzy główne typy kolekcji z MFC:

  • Iterowanie tablicy

  • Iterowanie listy

  • Iterowanie mapę

Do iteracji tablicy

  • Używać kolejnych liczb indeksu z GetAt Członkowskich funkcji:

    CTypedPtrArray<CObArray, CPerson*> myArray;
    
    myArray.Add(new CPerson());
    for (int i = 0; i < myArray.GetSize();i++)
    {
       CPerson* thePerson = myArray.GetAt(i);
       thePerson->AssertValid();
    }       
    

    W tym przykładzie użyto tablicy maszynowy wskaźnik, który zawiera odnośniki do CPerson obiektów.Tablica jest pochodną klasy CObArray, jeden z nontemplate wstępnie zdefiniowanych klas.GetAtZwraca wskaźnik do CPerson obiektu.Dla klas kolekcji maszynowy wskaźnika — tablic lub list — pierwszy parametr określa klasy podstawowej; drugi parametr określa typ przechowywania.

    CTypedPtrArray Także klasy overloads operatora, dzięki czemu można użyć zwyczajowe składni indeks dolny tablicy do dostępu elementy tablicy.Alternatywą do instrukcji znajdującej się w treści for jest powyżej pętli

    CPerson* thePerson = myArray[i];
    

    Ten operator istnieje zarówno w const i -const wersji.Const wersji, która jest wywoływana dla const tablice, mogą być wyświetlane tylko na prawej stronie instrukcji przypisania.

Iteracyjne listy

  • Użyj funkcji elementów członkowskich GetHeadPosition i GetNext do sposobu pracy użytkownika za pośrednictwem listy:

    CTypedPtrList<CObList, CPerson*> myList;
    
    myList.AddHead(new CPerson());
    POSITION pos = myList.GetHeadPosition();
    while(pos != NULL)
    {
       CPerson* thePerson = myList.GetNext(pos);
       thePerson->AssertValid();
    }
    

    W tym przykładzie użyto listy maszynowy wskaźnik zawierają wskaźniki do CPerson obiektów.Deklaracja listy podobne do jednej tablicy w procedurze do iteracji tablicy , ale jest pochodną klasy CObList.GetNextZwraca wskaźnik do CPerson obiektu.

Iteracyjne mapę

  • Użyj GetStartPosition do początku mapy i GetNextAssoc wielokrotnie uzyskać następnego kluczy i wartości z mapy, jak pokazano w następującym przykładzie:

    CMap<CString, LPCTSTR, CPerson*, CPerson*> myMap;
    CPerson myPerson;
    
    myMap.SetAt(_T("Bill"), &myPerson);
    POSITION pos = myMap.GetStartPosition();
    while(pos != NULL)
    {
       CPerson* pPerson;
       CString string;
       // Get key (string) and value (pPerson)
       myMap.GetNextAssoc(pos, string, pPerson);
       // Use string and pPerson
    }       
    

    W tym przykładzie użyto szablonu prostych map (zamiast kolekcji maszynowy wskaźnik), która używa CString klawiszy i przechowuje wskaźniki do CPerson obiektów.Podczas korzystania z funkcji dostępu, takich jak GetNextAssoc, klasa udostępnia wskaźniki do CPerson obiektów.Jeśli używasz jednego z kolekcji nontemplate mapę zamiast, musi oddać zwracane CObject wskaźnik do wskaźnika do CPerson.

    [!UWAGA]

    Dla nontemplate mapy, kompilator wymaga odwołania do CObject wskaźnik w ostatnim parametrem GetNextAssoc.Na wejściu musi oddać wskaźniki dla tego typu, jak w następnym przykładzie.

    Roztwór szablonu jest prostsze i zapewnia lepsze bezpieczeństwo typu.Kod nontemplate jest bardziej skomplikowana, jak pokazano tutaj:

    CMapStringToOb myMap;    // A nontemplate collection class
    CPerson myPerson;
    myMap.SetAt(_T("Bill"), &myPerson);
    
    POSITION pos = myMap.GetStartPosition();
    while(pos != NULL)
    {
       CPerson* pPerson;
       CString string;
       // Gets key (string) and value (pPerson)
       myMap.GetNextAssoc(pos, string, 
                         (CObject*&)pPerson);
       ASSERT(pPerson->IsKindOf(
                 RUNTIME_CLASS(CPerson)));
       // Use string and pPerson
    }
    

Aby uzyskać więcej informacji, zobacz Usuwanie wszystkich obiektów w kolekcji CObject.

Zobacz też

Koncepcje

Kolekcje