Поделиться через


Доступ ко всем членам коллекции

Классы коллекций MFC массива и команды, — и не использует индексы для получения их элементы. Классы списка и собрания карт MFC и команды, и не используют — индикатор типа ПОЛОЖЕНИЕ, чтобы описать заданное положение в коллекции. Для получения одного или нескольких членов этих коллекций необходимо инициализировать датчик положения и затем повторно передайте эту позицию в коллекции и запросе его, чтобы вернуть следующий элемент. Коллекция не отвечает за данных поддержание состояния о ходе выполнения итерации. Эти сведения хранятся в датчике ниже. Но данные, указанное положение, коллекция служит для возврата следующий элемент.

Следующие процедуры показывают, как итерации 3 главными типов коллекций, передаваемых с MFC.

  • Цикл массив

  • Цикл список

  • Цикл сопоставление

Выполнить итерацию массива

  • Использовать последовательные индексы с помощью функции-члена GetAt:

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

    В этом примере используется типизированный массив указателей, содержит указатели на объекты CPerson. Массив является производным от класса CObArray, одного из классов предопределенных nontemplate. GetAt возвращает указатель на объект CPerson. Для типизированных классов коллекций указателя — массивы или списки — первый параметр задает базовый класс; второй параметр задает тип для хранения.

    Класс CTypedPtrArray также перегрузите оператор [ ], чтобы его можно было использовать привычный синтаксис массив- индекса доступа к элементам массива. Альтернативой инструкцию в теле цикла for выше

    CPerson* thePerson = myArray[i];
    

    Этот оператор существует как в const, так и в версиях не const. Версия const, которая вызывается для массивов, const может использоваться только в правой части оператора присваивания.

Перебор списка

  • Используйте функции-члены GetHeadPosition и GetNext для работы этого способа по списку.

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

    В этом примере используется типизированный список указателя для хранения указателей на объекты CPerson. Объявление списка напоминает для массива в процедуре Выполнить итерацию массива, наследуется от класса CObList. GetNext возвращает указатель на объект CPerson.

Выполнить сопоставление

  • Использование GetStartPosition доступ к началу сопоставления и GetNextAssoc повторно, чтобы получить следующий ключ и значение из сопоставления, как показано в следующем примере.

    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
    }       
    

    В этом примере используется простой шаблон сопоставления (а не типизированная коллекция указателя), использует ключи CString и сохраняет указателей на объекты CPerson. При использовании функции доступа, например GetNextAssoc, класс содержит указатели на объекты CPerson. При использовании одного из собраний карт nontemplate вместо этого необходимо привести указатель возвращаемой CObject к указателю на CPerson.

    Примечание

    Для nontemplate сопоставлений компилятор требуется ссылка на указатель CObject в последнем параметра в GetNextAssoc.На входе, необходимо привести к указатели для данного типа, как показано в следующем примере.

    Решение шаблона проще справки и обеспечивают более высокую безопасность типов. Код nontemplate осложнятьле можно увидеть, как показано ниже:

    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
    }
    

Дополнительные сведения см. в разделе Удалить все объекты в коллекции CObject.

См. также

Основные понятия

Коллекции