Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of mappen te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen om mappen te wijzigen.
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
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