共用方式為


存取集合的所有元素

MFC 陣列集合類別 -- 範本型和非 - 使用索引來存取其元素。 MFC 清單和映射集合類別 ─ 無論是基於範本的還是非範本的 ─ 都使用 POSITION 類型的指標來描述集合中的指定位置。 若要存取這些集合的一或多個成員,請先初始化位置指標,然後不斷傳遞該位置至集合,並要求它傳回下一個元素。 集合不負責維護有關反覆專案進度的狀態資訊。 該資訊會保留在位置指標中。 但是,給定特定位置,集合負責傳回下一個元素。

下列程序展示如何遍歷 MFC 所提供的三種主要集合類型:

若要反覆運算陣列

  1. 使用循序索引編號搭配成員函式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,這是其中一個非範本預先定義的類別。 GetAt 傳回指向 CPerson 物件的指標。 對於具類型的指標集合類別 — 陣列或清單 — 第一個參數會指定基類;第二個參數會指定要儲存的類型。

    類別 CTypedPtrArray 也會多載 [ ] 運算符,以便您可以使用慣用的陣列下標語法來存取陣列的元素。 上述迴圈主體中的語句可以替換為 for

    CPerson *thePerson = myArray[i];
    

    此運算符存在於const及非const版本中。 針對 const 陣列被呼叫的版本只能出現在指派語句的右側。

若要反覆運算清單

  1. 使用成員函式 GetHeadPositionGetNext 逐步瀏覽清單:

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

    這個範例使用類型化指標清單來包含指向物件的指標 CPerson 。 清單宣告類似於程式中逐一遍歷陣列的宣告,但衍生自類別CObListGetNext 傳回指向 CPerson 物件的指標。

若要反覆運算地圖

  1. 使用 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 。 如果您改用其中一個非範本的地圖集合,則必須將傳回的 CObject 指標轉換為指向 CPerson 的指標。

    備註

    針對非範本映射,編譯器需要一個對CObject的指標在最後一個GetNextAssoc參數中的參考。 在輸入時,您必須將指標轉換成該類型,如下一個範例所示。

    範本解決方案更簡單,可協助提供更好的類型安全性。 非範本程式代碼比較複雜,如您可以在這裡看到:

    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 集合中的所有物件

另請參閱

集合