Acessar todos os membros de uma coleção

As classes de coleção MFC array — ambos baseado em modelo e não — usam índices para acesso seus elementos.As classes de coleção de lista e MAP MFC — ambos baseado em modelo e não — usar um indicador do tipo POSIÇÃO para descrever uma determinada posição dentro da coleção.Para acessar um ou mais membros dessas coleções, você primeiro inicializar o indicador de posição e, em seguida, várias vezes passa essa posição para a coleção e pedir para retornar o próximo elemento.A coleção não é responsável por manter as 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 o MFC:

  • Uma matriz de iteração

  • Uma lista de iteração

  • Iterando um MAP

Para iterar um array

  • 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 CObArrayuma das classes nontemplate predefinido. GetAt Retorna um ponteiro para um CPerson objeto. Para classes de coleção de tipos ponteiro — arrays ou listas — o primeiro parâmetro especifica a classe base; o segundo parâmetro especifica o tipo de armazenamento.

    The CTypedPtrArray class also overloads the [ ] operator so that you can use the customary array-subscript syntax to access elements of an array.Uma alternativa para a demonstrativo no corpo do for loop acima é

    CPerson* thePerson = myArray[i];
    

    Este operador existe em ambas as Const and non-Const versões.The Const versão, que é invocado para Const arrays, podem aparecer somente na lado direito da demonstrativo de atribuição.

Para iterar uma lista

  • Use as funções de membro GetHeadPosition e GetNext para trabalhar sua maneira através da 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 de tipos ponteiro para contêm ponteiros para CPerson objetos. A declaração da lista semelhante da matriz no procedimento Para iterar um array , mas é derivado da classe CObList. GetNext Retorna um ponteiro para um CPerson objeto.

Para iterar um MAP

  • Use GetStartPosition para ir para o início do MAP e GetNextAssoc para várias vezes obter a próxima chave e valor do MAP, 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 MAP simples (em vez de uma coleção de tipos ponteiro) que usa a CString chaves e armazenamentos de ponteiros para CPerson objetos. Ao usar funções de acesso, sistema autônomo GetNextAssoc, a classe fornece ponteiros para CPerson objetos. Se você usar uma das coleções nontemplate MAP em vez disso, você deve converter o retornado CObject ponteiro para um ponteiro para um CPerson.

    Observação:

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

    A solução de modelo é mais simples e ajuda a fornecer melhor segurança de tipos.O código nontemplate é mais complicado, sistema autônomo 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