Partager via


accès de tous les membres d'une collection

Les classes de collection de tableau MFC — basées sur un modèle ou non — utilisent des index pour accéder à leurs éléments. Les classes de liste et de collection de mappages MFC — basées sur un modèle ou non — utilisent un indicateur de type POSITION pour décrire une position spécifiée dans la collection. Pour accéder à un ou plusieurs membres de ces collections, vous initialisez d'abord l'indicateur de position et passez ensuite à plusieurs reprises cette position à la collection et demandez-lui de retourner l'élément suivant. La collection n'est pas responsable du maintien des informations d'état sur la progression de l'itération. Ces informations sont conservées dans l'indicateur de position. Mais, compte tenu d'une position spécifique, la collection est chargée de retourner l'élément suivant.

Les procédures suivantes montrent comment parcourir les trois types principaux de collections fournies avec MFC :

  • Itérer un tableau

  • Itérer une liste

  • Parcourir une carte

Pour itérer un tableau

  • Indices séquentiels d'utilisation de la fonction membre 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 pointeurs typé qui contient des pointeurs sur les objets CPerson. La table est dérivée de la classe CObArray, l'une des classes prédéfinies non basées sur des modèles. GetAt renvoie un pointeur vers un objet CPerson. Pour les classes de collection de pointeur typé — les tables ou les listes — le premier paramètre spécifie la classe de base ; le deuxième paramètre spécifie le type à stocker.

    La classe CTypedPtrArray surcharge également l'opérateur [ ] afin que vous puissiez utiliser la syntaxe usuelle d'inscription de tableau pour accéder aux éléments d'un tableau. Une alternative à l'instruction dans le corps de la boucle for ci-dessus est

    CPerson* thePerson = myArray[i];
    

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

Pour parcourir une liste

  • Utilisez les fonctions membres GetHeadPosition et GetNext pour parcourir 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 type de pointeur pour contenir les pointeurs aux objets CPerson. La déclaration de liste ressemble à celui du tableau dans la procédure Itérer un tablea mais est dérivée de la classe CObList. GetNext renvoie un pointeur vers un objet CPerson.

Pour parcourir une carte

  • Utilisez GetStartPosition pour obtenir le début de la carte et GetNextAssoc pour obtenir de façon répétée la clé et la valeur suivantes de la carte, comme indiqué dans 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 carte (au lieu d'une collection de pointeurs typés) qui utilise CString index et fournit des pointeurs aux objets CPerson. Lorsque vous utilisez les fonctions d'accès telles que GetNextAssoc, la classe fournit des pointeurs aux objets CPerson. Si vous utilisez l'une des collections de cartes basées sur des modèles à la place, vous devez caster le pointeur retourné par CObject sur un pointeur vers CPerson.

    Notes

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

    La solution de modèle est plus simple et vous aide à fournir une meilleure sécurité de type. Le code non basé sur des modèles est plus compliqué, comme vous pouvez le voir 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 CObject.

Voir aussi

Concepts

Collections