共用方式為


存取集合中的所有成員

MFC 陣列集合類別,兩者以範本為基礎,並不 — 使用索引來存取其項目。MFC 清單和對應集合類別,兩者皆以範本為基礎,並不 — 使用的型別指標位置來描述集合中的指定之位置。若要存取這些集合的一或多個成員,您第一次初始化位置指示器,然後重複傳遞至集合的該位置並要求傳回下一個項目。集合並不負責維護反覆項目有關進度的狀態資訊。該資訊是存放在位置指示器。不過,根據所給的特定位置,集合是負責傳回下一個項目。

下列程序會示範如何反覆查看隨 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,非樣板的其中一個預先定義的類別。GetAt變數的指標,會傳回CPerson物件。對於具型別的指標的集合類別 — 陣列或 list — 第一個參數指定的基底類別。 第二個參數會指定要儲存的型別。

    CTypedPtrArray類別也多載 運算子,讓您可以使用自訂的陣列註標語法來存取陣列元素。另一個方法的主體中的陳述式是for是上述的迴圈

    CPerson* thePerson = myArray[i];
    

    這個運算子存在於兩個 const 而非-const 版本。Const 版本,會針對叫用 const 陣列,可以只出現在右下方的指派陳述式。

若要重複串列

  • 使用成員函式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物件。

若要重複對應

  • 使用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物件。當您使用 access 的功能,例如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 集合中刪除所有物件

請參閱

概念

集合