Accès à tous les membres d'une collection

Les classes de collection du tableau MFC (modèle-basé et non — utilisation fois pour accéder à leurs éléments.Les classes de liste et de collection de tables de MFC — modèle-basé et non — utilisent un indicateur de type POSITION pour décrire une position donnée dans la collection.Pour accéder à un ou plusieurs membres de ces collections, vous initialisez d'abord l'indicateur de position et passez à son tour à plusieurs reprises cette position à la collection et lui demander de renvoyer l'élément suivant.La collection n'est pas chargé de gérer les informations d'état sur la progression de l'itération.Ces informations sont maintenues dans l'indicateur de position.Mais, si une position particulière, la collection est chargée de retourner l'élément suivant.

Les procédures suivantes montrent comment itérer au sein de les trois principaux types de collections fournies avec MFC :

  • Itérer un tableau

  • Itérer une liste

  • Itérer une carte

Pour itérer un tableau

  • Numéros séquentiels d'utilisation avec la fonction membre d' GetAt :

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

    Cet exemple utilise un tableau de pointeur typée qui contient des pointeurs vers des objets d' CPerson .Le tableau est dérivée de la classe CObArray, l'une des classes intégrées non basées sur des modèles.GetAt retourne un pointeur vers un objet d' CPerson .Pour les classes de collections typées de pointeur — les tableaux ou les listes — le premier paramètre spécifie la classe de base ; le deuxième paramètre spécifie le type à enregistrer.

    La classe d' CTypedPtrArray surcharge également l'opérateur de [] afin de pouvoir utiliser la syntaxe courante employée pour matrice-indice pour accéder aux éléments d'un tableau.Une alternative à l'instruction dans le corps de la boucle de for ci-dessus est

    CPerson* thePerson = myArray[i];
    

    Cet opérateur existe dans const et les versions non deconst .La version de const , qui est appelée pour les tableaux de const , peut apparaître uniquement à droite d'une instruction d'assignation.

Pour itérer une liste

  • Utilisez les fonctions membres GetHeadPosition et GetNext pour travailler votre méthode via la liste :

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

    Cet exemple utilise une liste typée de pointeur pour contenir les pointeurs vers des objets d' CPerson .La déclaration de liste ressemble à celui du tableau dans la procédure Pour itérer un tableau mais est dérivée de la classe CObList.GetNext retourne un pointeur vers un objet d' CPerson .

Pour itérer une carte

  • Utilisez GetStartPosition pour accéder au début de la carte et d' GetNextAssoc pour accéder à plusieurs reprises la clé et la valeur suivantes de la carte, comme le montre l'exemple suivant :

    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
    }       
    

    Cet exemple utilise un modèle simple de mappage (et non d'une collection typée de pointeur) qui utilise qu' CString fois et enregistre les pointeurs vers des objets d' CPerson .Lorsque vous utilisez des fonctions d'accès comme GetNextAssoc, la classe fournit des pointeurs vers des objets d' CPerson .Si vous utilisez l'une des collections de tables non basées sur des modèles à la place, vous devez effectuer un cast du pointeur retourné d' CObject à un pointeur vers CPerson.

    [!REMARQUE]

    Pour les cartes non basées sur des modèles, le compilateur requiert une référence à un pointeur d' CObject dans le dernier paramètre à GetNextAssoc.Lors de l'entrée, vous devez effectuer un cast les pointeurs à ce type, comme indiqué dans l'exemple suivant.

    La solution de modèle est plus simple et fournit une meilleure sécurité de type.Code non basé sur un modèle est plus complexe, comme présenté ici :

    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
    }
    

Pour plus d'informations, consultez supprimer tous les objets dans une collection de CObject.

Voir aussi

Concepts

Collections