Для доступа ко всем элементам коллекции
Классы коллекций MFC и массива шаблон-основано и не — использует индексы для получения доступа к их элементы.Классы коллекций MFC и списка сопоставления — и шаблон-основано и не — использующих индикатор типа POSITION для описания заданную позицию в коллекции.Для доступа к один или несколько членов этих коллекций, необходимо вначале инициализировать индикатор bin, а затем повторно передать эту позицию в коллекции и ее запросе, чтобы возвратить следующий элемент.Коллекция не отвечает за сохранения сведений о состоянии о ходе выполнения итерации.Эти данные сохраняются в индикаторе позиции.Но учитывая указанное положение коллекция отвечает за возвращение следующий элемент.
В процедурах ниже показана методика выполнения итерации по 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.