共用方式為


存取集合的所有成員

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 也會多載 [ ] 運算子,讓您可以使用自訂的 array-subscript 語法來存取陣列的專案。 上述 for 迴圈主體中的陳述式可替代成

    CPerson *thePerson = myArray[i];
    

    此運算子同時 const 存在於 和非 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 集合中的所有物件

另請參閱

集合