Acessar todos os membros de uma coleção

As classes de coleção do MFC array — ambos baseado no modelo e não — usam índices para acessar seus elementos.Classes de coleção MFC lista e mapa — ambos baseado no modelo e não — usar um indicador do tipo posição para descrever uma determinada posição dentro da coleção.Para acessar membros de uma ou mais dessas coleções, você primeiro inicializar o indicador de posição repetidamente passa a posição para a coleção e pede a ele para retornar o próximo elemento.A coleção não é responsável por manter informações de estado sobre o progresso da iteração.Que informações são mantidas no indicador de posição.Mas, dada uma determinada posição, a coleção é responsável por retornar o próximo elemento.

Os procedimentos a seguir mostram como iterar sobre os três principais tipos de coleções fornecidos com MFC:

  • Iterando uma matriz

  • Iterando uma lista

  • Iterando um mapa

Para fazer a iteração de uma matriz

  • Use números seqüenciais de índice com o GetAt função de membro:

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

    Este exemplo usa uma matriz de ponteiro digitado contém ponteiros para CPerson objetos.A matriz é derivada da classe CObArray, um de nontemplate classes predefinidas.GetAtRetorna um ponteiro para um CPerson objeto.Classes de coleção de ponteiro digitado — arrays ou listas — o primeiro parâmetro especifica a classe base; o segundo parâmetro especifica o tipo de armazenamento.

    O CTypedPtrArray classe também sobrecargas de operador para que você possa usar a sintaxe habitual do subscrito da matriz para acessar os elementos de uma matriz.Uma alternativa à instrução no corpo do for loop acima é

    CPerson* thePerson = myArray[i];
    

    Este operador existe em ambas as const e não-const versões.O const versão, que é invocado para const matrizes, pode aparecer somente no lado direito de uma instrução de atribuição.

Para iterar uma lista

  • Use as funções de membro GetHeadPosition e GetNext para examinar a lista:

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

    Este exemplo usa uma lista ponteiro digitado contém ponteiros para CPerson objetos.A declaração de lista semelhante da matriz no procedimento iterar uma matriz , mas é derivada da classe CObList.GetNextRetorna um ponteiro para um CPerson objeto.

Para iterar um mapa

  • Use GetStartPosition para ir para o início do mapa e GetNextAssoc repetidamente obter a próxima chave e valor do mapa, conforme mostrado pelo seguinte exemplo:

    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
    }       
    

    Este exemplo usa um modelo de mapa simples (em vez de uma coleção de ponteiro digitado) que usa CString chaves e armazena ponteiros para CPerson objetos.Ao usar funções de acesso, como GetNextAssoc, a classe fornece ponteiros para CPerson objetos.Se você usar uma das coleções de mapa nontemplate, você deve converter o retornado CObject ponteiro para um ponteiro para um CPerson.

    ObservaçãoObservação

    Para mapas de nontemplate, o compilador requer uma referência a um CObject ponteiro no último parâmetro para GetNextAssoc.Na entrada, você deve converter os ponteiros para esse tipo, conforme mostrado no exemplo a seguir.

    O modelo mais simples e a solução ajuda a fornecer melhor segurança de tipos.O código de nontemplate é mais complicado, como você pode ver aqui:

    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
    }
    

Para obter mais informações, consulte Excluir todos os objetos em uma coleção CObject.

Consulte também

Conceitos

Coleções