Share via


CArray-klasse

Opmerking

De Microsoft Foundation Classes-bibliotheek (MFC) wordt nog steeds ondersteund. We voegen echter geen functies meer toe of werken de documentatie bij.

Ondersteunt matrices die lijken op C-matrices, maar kunnen zo nodig dynamisch verminderen en groeien.

Syntaxis

template <class TYPE, class ARG_TYPE = const TYPE&>
class CArray : public CObject

Parameterwaarden

TYPE
Sjabloonparameter waarmee het type objecten wordt opgegeven dat is opgeslagen in de matrix. TYPE is een parameter die wordt geretourneerd door CArray.

ARG_TYPE
Sjabloonparameter waarmee het argumenttype wordt opgegeven dat wordt gebruikt voor toegang tot objecten die zijn opgeslagen in de matrix. Vaak een verwijzing naar TYPE. ARG_TYPE is een parameter die wordt doorgegeven aan CArray.

Leden

Openbare constructors

Naam Description
CArray::CArray Maakt een lege matrix.

Openbare methoden

Naam Description
CArray::Add Voegt een element toe aan het einde van de matrix; groeit de matrix indien nodig.
CArray::Append Voegt een andere matrix toe aan de matrix; de matrix indien nodig te laten groeien
CArray::Copy Kopieert een andere matrix naar de matrix; groeit de matrix indien nodig.
CArray::ElementAt Retourneert een tijdelijke verwijzing naar de elementpointer in de matrix.
CArray::FreeExtra Hiermee wordt al het ongebruikte geheugen boven de huidige bovengrens vrijgemaakt.
CArray::GetAt Retourneert de waarde in een bepaalde index.
CArray::GetCount Hiermee haalt u het aantal elementen in deze matrix op.
CArray::GetData Hiermee heeft u toegang tot elementen in de matrix. Kan zijn NULL.
CArray::GetSize Hiermee haalt u het aantal elementen in deze matrix op.
CArray::GetUpperBound Retourneert de grootste geldige index.
CArray::InsertAt Hiermee voegt u een element (of alle elementen in een andere matrix) in een opgegeven index in.
CArray::IsEmpty Bepaalt of de matrix leeg is.
CArray::RemoveAll Hiermee verwijdert u alle elementen uit deze matrix.
CArray::RemoveAt Hiermee verwijdert u een element in een specifieke index.
CArray::SetAt Hiermee stelt u de waarde voor een bepaalde index in; matrix mag niet groeien.
CArray::SetAtGrow Hiermee stelt u de waarde voor een bepaalde index in; groeit de matrix indien nodig.
CArray::SetSize Hiermee stelt u het aantal elementen in dat in deze matrix moet worden opgenomen.

Openbare operators

Naam Description
operator[] Hiermee stelt u het element in of haalt u het op in de opgegeven index.

Opmerkingen

Matrixindexen beginnen altijd op positie 0. U kunt beslissen of u de bovengrens wilt herstellen of de matrix wilt inschakelen om uit te vouwen wanneer u elementen toevoegt voorbij de huidige afhankelijke. Geheugen wordt aaneengesloten aan de bovengrens toegewezen, zelfs als sommige elementen null zijn.

Opmerking

De meeste methoden waarmee het formaat van een CArray object wordt gewijzigd of elementen aan het memcpy_s object worden toegevoegd om elementen te verplaatsen. Dit is een probleem omdat memcpy_s deze niet compatibel is met objecten waarvoor de constructor moet worden aangeroepen. Als de items in de CArray items niet compatibel zijn met memcpy_s, moet u een nieuwe CArray grootte maken. Vervolgens moet u de nieuwe matrix gebruiken CArray::Copy en CArray::SetAt vullen omdat deze methoden een toewijzingsoperator gebruiken in plaats van memcpy_s.

Net als bij een C-matrix is de toegangstijd voor een CArray geïndexeerd element constant en is deze onafhankelijk van de matrixgrootte.

Aanbeveling

Voordat u een matrix gebruikt, gebruikt SetSize u deze om de grootte ervan vast te stellen en geheugen toe te wijzen. Als u dit niet doet SetSize, zorgt het toevoegen van elementen aan uw matrix ervoor dat deze vaak opnieuw wordt toegewezen en gekopieerd. Frequente herlocatie en kopiëren zijn inefficiënt en kunnen geheugenfragmenteren.

Als u een dump van afzonderlijke elementen in een matrix nodig hebt, moet u de diepte van het CDumpContext object instellen op 1 of groter.

Bepaalde lidfuncties van deze klasse roepen globale helperfuncties aan die moeten worden aangepast voor de meeste toepassingen van de CArray klasse. Zie de helpers van de klasseKlasse van het onderwerp in de sectie MFC-macro's en globals.

De afleiding van matrixklasse lijkt op lijstdeivatie.

Zie het artikel Verzamelingen voor meer informatie over het gebruik CArrayervan.

Overnamehiërarchie

CObject

CArray

Requirements

Rubriek:afxtempl.h

CArray::Add

Hiermee voegt u een nieuw element toe aan het einde van een matrix, waarmee de matrix met 1 wordt uitgebreid.

INT_PTR Add(ARG_TYPE newElement);

Parameterwaarden

ARG_TYPE
Sjabloonparameter die het type argumenten aangeeft dat verwijst naar elementen in deze matrix.

newElement
Het element dat moet worden toegevoegd aan deze matrix.

Retourwaarde

De index van het toegevoegde element.

Opmerkingen

Als SetSize deze is gebruikt met een nGrowBy waarde groter dan 1, kan extra geheugen worden toegewezen. De bovengrens neemt echter met slechts 1 toe.

Example

// example for CArray::Add
CArray<CPoint, CPoint> ptArray;

CPoint pt(10, 20);
ptArray.Add(pt);             // Element 0
ptArray.Add(CPoint(30, 40)); // Element 1

CArray::Append

Roep deze lidfunctie aan om de inhoud van de ene matrix aan het einde van een andere matrix toe te voegen.

INT_PTR Append(const CArray& src);

Parameterwaarden

src
Bron van de elementen die moeten worden toegevoegd aan een matrix.

Retourwaarde

De index van het eerste toegevoegde element.

Opmerkingen

De matrices moeten van hetzelfde type zijn.

Indien nodig Append kan er extra geheugen worden toegewezen aan de elementen die aan de matrix zijn toegevoegd.

Example

CArray<CPoint, CPoint> myArray1, myArray2;

// Add elements to the second array.
myArray2.Add(CPoint(11, 22));
myArray2.Add(CPoint(12, 42));

// Add elements to the first array and also append the second array.
myArray1.Add(CPoint(1, 2));
myArray1.Append(myArray2);

CArray::CArray

Maakt een lege matrix.

CArray();

Opmerkingen

De matrix groeit één element tegelijk.

Example

CArray<CPoint, CPoint> ptArray;

CArray::Copy

Gebruik deze lidfunctie om de elementen van de ene matrix naar een andere te kopiëren.

void Copy(const CArray& src);

Parameterwaarden

src
Bron van de elementen die moeten worden gekopieerd naar een matrix.

Opmerkingen

Roep deze lidfunctie aan om de elementen van de ene matrix te overschrijven met de elementen van een andere matrix.

Copy maakt geen geheugen vrij; Indien nodig Copy kan echter extra geheugen worden toegewezen om de elementen die naar de matrix zijn gekopieerd, toe te passen.

Example

CArray<CPoint, CPoint> myArray1, myArray2;

// Add elements to the second array.
myArray2.Add(CPoint(11, 22));
myArray2.Add(CPoint(12, 42));

// Copy the elements from the second array to the first.
myArray1.Copy(myArray2);

CArray::ElementAt

Retourneert een tijdelijke verwijzing naar het opgegeven element in de matrix.

TYPE& ElementAt(INT_PTR nIndex);
const TYPE& ElementAt(INT_PTR nIndex) const;

Parameterwaarden

nIndex
Een geheel getal dat groter is dan of gelijk is aan 0 en kleiner dan of gelijk aan de waarde die wordt geretourneerd door GetUpperBound.

Retourwaarde

Een verwijzing naar een matrixelement.

Opmerkingen

Deze wordt gebruikt voor het implementeren van de toewijzingsoperator aan de linkerkant voor matrices.

Example

Zie het voorbeeld voor GetSize.

CArray::FreeExtra

Maakt extra geheugen vrij die is toegewezen tijdens de groei van de matrix.

void FreeExtra();

Opmerkingen

Deze functie heeft geen effect op de grootte of bovengrens van de matrix.

Example

Zie het voorbeeld voor GetData.

CArray::GetAt

Retourneert het matrixelement op de opgegeven index.

TYPE& GetAt(INT_PTR nIndex);
const TYPE& GetAt(INT_PTR nIndex) const;

Parameterwaarden

TYPE
Sjabloonparameter die het type matrixelementen opgeeft.

nIndex
Een geheel getal dat groter is dan of gelijk is aan 0 en kleiner dan of gelijk aan de waarde die wordt geretourneerd door GetUpperBound.

Retourwaarde

Het matrixelement dat zich momenteel in deze index bevindt.

Opmerkingen

Het doorgeven van een negatieve waarde of een waarde die groter is dan de waarde die door GetUpperBound wordt geretourneerd, resulteert in een mislukte assertie.

Example

CArray<CPoint, CPoint> myArray;
CPoint pt;

// Add elements to the array.
for (int i = 0; i < 10; i++)
{
   myArray.Add(CPoint(i, 2 * i));
}

// Modify all the points in the array.
for (int i = 0; i <= myArray.GetUpperBound(); i++)
{
   pt = myArray.GetAt(i);
   pt.x = 0;
   myArray.SetAt(i, pt);
}

CArray::GetCount

Geeft als resultaat het aantal matrixelementen.

INT_PTR GetCount() const;

Retourwaarde

Het aantal items in de matrix.

Opmerkingen

Roep deze methode aan om het aantal elementen in de matrix op te halen. Omdat indexen op nul zijn gebaseerd, is de grootte 1 groter dan de grootste index. Als u deze methode aanroept, wordt hetzelfde resultaat gegenereerd als de CArray::GetSize methode.

Example

CArray<CPoint, CPoint> myArray;

// Add elements to the array.
for (int i = 0; i < 10; i++)
   myArray.Add(CPoint(i, 2 * i));

// Modify all the points in the array.
for (int i = 0; i < myArray.GetCount(); i++)
{
   CPoint &pt = myArray.ElementAt(i);
   pt.x = 0;
}

CArray::GetData

Gebruik deze lidfunctie om directe toegang te krijgen tot de elementen in een matrix.

const TYPE* GetData() const;
TYPE* GetData();

Parameterwaarden

TYPE
Sjabloonparameter die het type matrixelementen opgeeft.

Retourwaarde

Een aanwijzer naar een matrixelement.

Opmerkingen

Als er geen elementen beschikbaar zijn, GetData wordt een null-waarde geretourneerd.

Hoewel directe toegang tot de elementen van een matrix u kan helpen sneller te werken, moet u voorzichtig zijn bij het aanroepen GetData; eventuele fouten die u rechtstreeks aanbrengt, zijn van invloed op de elementen van uw matrix.

Example

CArray<CPoint, CPoint> myArray;

// Allocate memory for at least 32 elements.
myArray.SetSize(32, 128);

// Add elements to the array.
CPoint *pPt = (CPoint *)myArray.GetData();
for (int i = 0; i < 32; i++, pPt++)
{
   *pPt = CPoint(i, 2 * i);
}

// Only keep first 5 elements and free extra (unused) bytes.
myArray.SetSize(5, 128);
myArray.FreeExtra();

#if _DEBUG
afxDump.SetDepth(1);
afxDump << "myArray: " << &myArray << "\n";
#endif

CArray::GetSize

Retourneert de grootte van de matrix.

INT_PTR GetSize() const;

Opmerkingen

Omdat indexen op nul zijn gebaseerd, is de grootte 1 groter dan de grootste index. Als u deze methode aanroept, wordt hetzelfde resultaat gegenereerd als de CArray::GetCount methode.

Example

CArray<CPoint, CPoint> myArray;

// Add elements to the array.
for (int i = 0; i < 10; i++)
   myArray.Add(CPoint(i, 2 * i));

// Modify all the points in the array.
for (int i = 0; i < myArray.GetSize(); i++)
{
   CPoint &pt = myArray.ElementAt(i);
   pt.x = 0;
}

CArray::GetUpperBound

Retourneert de huidige bovengrens van deze matrix.

INT_PTR GetUpperBound() const;

Opmerkingen

Omdat matrixindexen op nul zijn gebaseerd, retourneert deze functie een waarde van 1 kleiner dan GetSize.

De voorwaarde GetUpperBound( ) = -1 geeft aan dat de matrix geen elementen bevat.

Example

Zie het voorbeeld voor CArray::GetAt.

CArray::InsertAt

Met de eerste versie van het invoegen van InsertAt één element (of meerdere kopieën van een element) in een opgegeven index in een matrix.

void InsertAt(
    INT_PTR nIndex,
    ARG_TYPE newElement,
    INT_PTR nCount = 1);

void InsertAt(
    INT_PTR nStartIndex,
    CArray* pNewArray);

Parameterwaarden

nIndex
Een geheel getal dat groter kan zijn dan de waarde die door GetUpperBound.

ARG_TYPE
Sjabloonparameter die het type elementen in deze matrix opgeeft.

newElement
Het element dat in deze matrix moet worden geplaatst.

nCount
Het aantal keren dat dit element moet worden ingevoegd (standaard ingesteld op 1).

nStartIndex
Een geheel getal dat groter kan zijn dan de waarde die door GetUpperBound.

pNewArray
Een andere matrix die elementen bevat die aan deze matrix moeten worden toegevoegd.

Opmerkingen

In het proces wordt het bestaande element in deze index omhoog verplaatst (door de index te verhogen) en worden alle elementen erboven verplaatst.

Met de tweede versie worden alle elementen uit een andere CArray verzameling ingevoegd, te beginnen bij de nStartIndex positie.

De SetAt functie vervangt daarentegen één opgegeven matrixelement en verschuift geen elementen.

Example

// example for CArray::InsertAt

CArray<CPoint, CPoint> ptArray;

ptArray.Add(CPoint(10, 20));         // Element 0
ptArray.Add(CPoint(30, 40));         // Element 1 (will become element 2)
ptArray.InsertAt(1, CPoint(50, 60)); // New element 1

CArray::IsEmpty

Bepaalt of de matrix leeg is.

BOOL IsEmpty() const;

Retourwaarde

Niet-nul als de matrix geen elementen bevat; anders 0.

CArray::operator []

Deze subscriptoperators zijn een handige vervanging voor de SetAt en GetAt functies.

TYPE& operator[](int_ptr nindex);
const TYPE& operator[](int_ptr nindex) const;

Parameterwaarden

TYPE
Sjabloonparameter die het type elementen in deze matrix opgeeft.

nIndex
Index van het element dat moet worden geopend.

Opmerkingen

De eerste operator, die wordt aangeroepen voor matrices die niet constzijn, kan worden gebruikt aan de rechterkant (r-waarde) of aan de linkerkant (l-waarde) van een toewijzingsinstructie. De tweede, die wordt aangeroepen voor const matrices, mag alleen aan de rechterkant worden gebruikt.

De foutopsporingsversie van de bibliotheek bevestigt of het subscript (links of rechts van een toewijzingsinstructie) buiten de grenzen valt.

Example

CArray<CPoint, CPoint> myArray;

// Add elements to the array.
for (int i = 0; i < 10; i++)
{
   myArray.Add(CPoint(i, 2 * i));
}

// Modify all the points in the array.
for (int i = 0; i <= myArray.GetUpperBound(); i++)
{
   myArray[i].x = 0;
}

CArray::RelocateElements

Verplaatst gegevens naar een nieuwe buffer wanneer de matrix moet groeien of verkleinen.

template<class TYPE, class ARG_TYPE>
AFX_INLINE void CArray<TYPE, ARG_TYPE>::RelocateElements(
    TYPE* pNewData,
    const TYPE* pData,
    INT_PTR nCount);

Parameterwaarden

pNewData
Een nieuwe buffer voor de matrix met elementen.

pData
De oude matrix met elementen.

nCount
Aantal elementen in de oude matrix.

Opmerkingen

pNewData is altijd groot genoeg om alle pData elementen vast te houden.

De CArray implementatie gebruikt deze methode om de oude gegevens naar een nieuwe buffer te kopiëren wanneer de matrix moet groeien of verkleinen (wanneer SetSize of FreeExtra worden aangeroepen). Met de standaard implementatie worden alleen de gegevens gekopieerd.

Voor matrices waarin een element een aanwijzer bevat naar een van de eigen leden, of een andere structuur een aanwijzer bevat naar een van de matrixelementen, worden de aanwijzers niet bijgewerkt in platte kopie. In dit geval kunt u aanwijzers corrigeren door een specialisatie van RelocateElements met de relevante typen te implementeren. U bent ook verantwoordelijk voor het kopiëren van gegevens.

CArray::RemoveAll

Hiermee verwijdert u alle elementen uit deze matrix.

void RemoveAll();

Opmerkingen

Als de matrix al leeg is, werkt de functie nog steeds.

Example

CArray<CPoint, CPoint> myArray;

// Add elements to the array.
for (int i = 0; i < 10; i++)
   myArray.Add(CPoint(i, 2 * i));

myArray.RemoveAll();

#ifdef _DEBUG
afxDump.SetDepth(1);
afxDump << "myArray: " << &myArray << "\n";
#endif

CArray::RemoveAt

Hiermee verwijdert u een of meer elementen die beginnen bij een opgegeven index in een matrix.

void RemoveAt(
    INT_PTR nIndex,
    INT_PTR nCount = 1);

Parameterwaarden

nIndex
Een geheel getal dat groter is dan of gelijk is aan 0 en kleiner dan of gelijk aan de waarde die wordt geretourneerd door GetUpperBound.

nCount
Het aantal elementen dat moet worden verwijderd.

Opmerkingen

Tijdens het proces worden alle elementen boven de verwijderde elementen omlaag verplaatst. Hiermee wordt de bovengrens van de matrix afbouwd, maar is er geen geheugen vrij.

Als u meer elementen probeert te verwijderen dan in de matrix boven het verwijderingspunt staat, wordt de foutopsporingsversie van de bibliotheek asserties.

Example

CArray<CPoint, CPoint> myArray;

// Add elements to the array.
for (int i = 0; i < 10; i++)
{
   myArray.Add(CPoint(i, 2 * i));
}

myArray.RemoveAt(5);

#ifdef _DEBUG
afxDump.SetDepth(1);
afxDump << "myArray: " << &myArray << "\n";
#endif

CArray::SetAt

Hiermee stelt u het matrixelement in op de opgegeven index.

void SetAt(INT_PTR nIndex, ARG_TYPE newElement);

Parameterwaarden

nIndex
Een geheel getal dat groter is dan of gelijk is aan 0 en kleiner dan of gelijk aan de waarde die wordt geretourneerd door GetUpperBound.

ARG_TYPE
Sjabloonparameter die het type argumenten aangeeft dat wordt gebruikt voor het verwijzen naar matrixelementen.

newElement
De nieuwe elementwaarde die moet worden opgeslagen op de opgegeven positie.

Opmerkingen

SetAt zorgt ervoor dat de matrix niet groeit. Gebruik SetAtGrow deze optie als u wilt dat de matrix automatisch groeit.

U moet ervoor zorgen dat de indexwaarde een geldige positie in de matrix vertegenwoordigt. Als deze buiten de grenzen valt, wordt de foutopsporingsversie van de bibliotheek asserties weergegeven.

Example

Zie het voorbeeld voor GetAt.

CArray::SetAtGrow

Hiermee stelt u het matrixelement in op de opgegeven index.

void SetAtGrow(INT_PTR nIndex, ARG_TYPE newElement);

Parameterwaarden

nIndex
Een geheel getal dat groter is dan of gelijk is aan 0.

ARG_TYPE
Sjabloonparameter waarmee het type elementen in de matrix wordt opgegeven.

newElement
Het element dat moet worden toegevoegd aan deze matrix. Een NULL waarde is toegestaan.

Opmerkingen

De matrix groeit automatisch indien nodig (dat wil gezegd, de bovengrens wordt aangepast om het nieuwe element aan te passen).

Example

// example for CArray::SetAtGrow
CArray<CPoint, CPoint> ptArray;

ptArray.Add(CPoint(10, 20)); // Element 0
ptArray.Add(CPoint(30, 40)); // Element 1
// Element 2 deliberately skipped
ptArray.SetAtGrow(3, CPoint(50, 60)); // Element 3

CArray::SetSize

Hiermee wordt de grootte van een lege of bestaande matrix vastgesteld; wijst indien nodig geheugen toe.

void SetSize(
    INT_PTR nNewSize,
    INT_PTR nGrowBy = -1);

Parameterwaarden

nNewSize
De nieuwe matrixgrootte (aantal elementen). Moet groter dan of gelijk zijn aan 0.

nGrowBy
Het minimum aantal elementsleuven dat moet worden toegewezen als een grootteverhoging nodig is.

Opmerkingen

Als de nieuwe grootte kleiner is dan de oude grootte, wordt de matrix afgekapt en wordt al het ongebruikte geheugen vrijgegeven.

Gebruik deze functie om de grootte van uw matrix in te stellen voordat u de matrix gaat gebruiken. Als u dit niet doet SetSize, zorgt het toevoegen van elementen aan uw matrix ervoor dat deze vaak opnieuw wordt toegewezen en gekopieerd. Frequente herlocatie en kopiëren zijn inefficiënt en kunnen geheugenfragmenteren.

De nGrowBy parameter is van invloed op de interne geheugentoewijzing terwijl de matrix groeit. Het gebruik is nooit van invloed op de matrixgrootte zoals gerapporteerd door GetSize en GetUpperBound. Als de standaardwaarde wordt gebruikt, wijst MFC geheugen toe op een manier die wordt berekend om geheugenfragmentatie te voorkomen en de efficiëntie voor de meeste gevallen te optimaliseren.

Example

Zie het voorbeeld voor GetData.

Zie ook

MFC-voorbeeld COLLECT
CObject klasse
Hiërarchiegrafiek
CObArray klasse
Helpers voor verzamelingsklassen