How to modify a non-const object using an array operator?

C++ ArrayList: En Dybdegående Guide

24/12/2022

Rating: 4.8 (13926 votes)

ArrayLists har været en del af programmørers værktøjskasse siden slutningen af 90'erne. De blev oprindeligt implementeret for at tilbyde en mere fleksibel dataindsamling end traditionelle arrays. Man finder dem i mange programmeringssprog som Java, C# og C++. En ArrayList er en type samling, der kan bruges til at opbevare forskellige datatyper. Dette betyder, at objekter fra helt forskellige klasser, såsom en streng og et heltal, kan eksistere side om side i den samme samling. Selvom dette lyder utroligt fleksibelt, er der både fordele og ulemper ved at bruge ArrayLists, især i en moderne C++ kontekst.

What is arraylisttut CPP?
ArrayListTut.cpp : Defines the entry point for the console application. // The above example includes and “stdafx.h”. This allows for the use of the standard library and utilize standard types. The three using namespaces are used to shorten the lines of code. The ArrayList type contains ‘^’ and gcnew.

Denne artikel vil dykke ned i, hvad en C++ ArrayList er, hvordan den fungerer, dens svagheder, og hvorfor den i dag stort set er blevet erstattet af mere effektive og sikre alternativer. Vi vil se på, hvordan man implementerer den, dens vigtigste egenskaber og metoder, og gennemgå et praktisk kodeeksempel.

Indholdsfortegnelse

Hvad er en ArrayList helt præcist?

En ArrayList kan bedst beskrives som en dynamisk liste af objekter, hvis størrelse kan ændres efter behov, og som kan tilgås via et heltalsindeks. Forestil dig en indkøbsliste, hvor du løbende kan tilføje og fjerne varer uden at skulle lave en helt ny liste hver gang. Det er kernen i en ArrayLists dynamiske natur. Dens store fordel er dens evne til at opbevare heterogene data – altså en blanding af forskellige datatyper. Du kan have en tekststreng på første plads, et tal på anden plads og endda en null-værdi på tredje plads. Denne fleksibilitet var revolutionerende, da den blev introduceret.

Desværre kommer denne fleksibilitet med en pris. Sammenlignet med simple arrays og især generiske lister (Generic Lists), er ArrayLists ineffektive. Deres største svaghed er manglen på typesikkerhed. Fordi listen ikke ved, hvilken type data den indeholder på forhånd, skal værdier 'bokses' (konverteres til en generel objekttype) ved tilføjelse og 'unboxes' (konverteres tilbage til deres oprindelige type) ved hentning. Denne konstante konvertering skaber overhead og reducerer ydeevnen markant. Desuden kan fejl i unboxing føre til runtime-fejl, som kompilatoren ikke kan fange på forhånd. Endelig er ArrayLists ikke trådsikre som standard, hvilket kan skabe problemer i applikationer med flere tråde.

Det Moderne Alternativ: Hvorfor `List<T>` er det Bedre Valg

På grund af de nævnte ulemper, især manglen på typesikkerhed og den dårlige ydeevne, er ArrayLists i C++ blevet erstattet af `List<T>` (en generisk liste). `List<T>` tilbyder alle de samme fordele som en ArrayList, såsom dynamisk størrelse og et rigt sæt af metoder til at manipulere data, men med én afgørende forbedring: den er typesikker.

Når du opretter en `List<T>`, specificerer du, hvilken datatype den skal indeholde (f.eks. `List<int>` for heltal eller `List<String^>` for strenge). Dette betyder, at kompilatoren kan garantere, at kun den korrekte datatype tilføjes til listen. Dette eliminerer behovet for boxing og unboxing, hvilket resulterer i markant bedre ydeevne og mere robust, fejlfri kode. Den generelle anbefaling er derfor klar: Brug kun ArrayList, hvis du er tvunget til at vedligeholde eksisterende, ældre kode. For al ny udvikling i C++ bør `List<T>` være dit foretrukne valg.

Sammenligning: ArrayList vs. `List<T>`

FunktionArrayList`List<T>`
TypesikkerhedNej (kan føre til runtime-fejl)Ja (fejl fanges under kompilering)
YdeevneLavere (pga. boxing/unboxing)Højere (ingen boxing/unboxing nødvendig)
Fleksibilitet (datatyper)Høj (kan indeholde alt)Begrænset til én type per liste
Anbefalet brugKun til vedligeholdelse af ældre kodeStandardvalg for ny C++ udvikling

Implementering af ArrayList i C++

En vigtig detalje er, at ArrayLists ikke er en del af C++ standardbiblioteket. Både ArrayLists og `List<T>` er i overensstemmelse med Common Language Runtime (CLR). For at bruge dem skal du aktivere CLR-understøttelse i dit projekts indstillinger. Dette gøres typisk i et udviklingsmiljø som Visual Studio.

Følg disse trin for at aktivere CLR:

  1. Åbn dit projekt i Visual Studio.
  2. Gå til menuen: Project > [Dit Projekts Navn] Properties...
  3. Under Configuration Properties, åbn fanen General.
  4. Find rækken Common Language Runtime Support.
  5. Vælg Common Language Runtime Support (/clr) fra dropdown-menuen.
  6. Gør det samme under Configuration Properties -> C/C++ -> General for at fuldføre aktiveringen.

Efter at have aktiveret CLR, kan du frit bruge ArrayList til at opbevare heterogene data i din løsning ved at inkludere de nødvendige navnerum.

Vigtige Egenskaber og Metoder

ArrayList kommer med en række indbyggede egenskaber og metoder, der gør det nemt at arbejde med data i samlingen.

Centrale Egenskaber

EgenskabBeskrivelse
CapacityHvor mange elementer ArrayList kan indeholde, før den skal udvide sin interne hukommelse.
CountDet faktiske antal elementer, der i øjeblikket er i ArrayList.
IsFixedSizeReturnerer en boolsk værdi, der angiver, om listen har en fast størrelse.
IsReadOnlyReturnerer en boolsk værdi, der angiver, om listen er skrivebeskyttet.

Udvalgte Metoder

Her er nogle af de mest anvendte metoder:

  • Add(Object^): Tilføjer et element til slutningen af listen.
  • Clear(): Fjerner alle elementer fra listen.
  • Contains(Object^): Tjekker, om et bestemt element findes i listen.
  • Remove(Object^): Fjerner den første forekomst af et specifikt element.
  • RemoveAt(Int): Fjerner elementet på et specifikt indeks.
  • Sort(): Sorterer elementerne i listen (kræver at elementerne kan sammenlignes).
  • Reverse(): Vender rækkefølgen af elementerne i listen.
  • ToArray(): Konverterer ArrayList til et almindeligt array af objekter.

Praktisk Eksempel: Kode og Forklaring

Lad os se på et konkret C++ eksempel, der demonstrerer, hvordan man opretter og bruger en ArrayList.

// Inkluderer nødvendige biblioteker #include <iostream> #include "stdafx.h" // Bruger System-navnerum for CLR-typer using namespace System; // Bruger Collections for adgang til ArrayList using namespace System::Collections; int main() { // Initialiser en ny ArrayList // Bemærk '^' og 'gcnew' for managed memory ArrayList^ minListe = gcnew ArrayList; // Tilføj forskellige værdier til listen minListe->Add("Bob Ross"); // Tilføj en streng minListe->Add("Bob Ross"); // Tilføj en duplikat streng minListe->Add(216); // Tilføj et heltal minListe->Add(43.1f); // Tilføj et flydende kommatal // Opret en IEnumerator for at gennemløbe listen IEnumerator^ enumerator = minListe->GetEnumerator(); // Gennemløb hvert element i listen while (enumerator->MoveNext()) { // Hent det nuværende element som et generelt Object Object^ objekt = safe_cast<Object^>(enumerator->Current); // Udskriv typen og værdien af objektet Console::WriteLine("Type: " + objekt->GetType() + " Værdi: " + objekt); } // Vent på brugerinput, før programmet lukker Console::ReadLine(); return 0; }

Forklaring af Koden

Koden ovenfor demonstrerer de grundlæggende principper. Først initialiseres en ny ArrayList ved hjælp af gcnew, som er nødvendigt for at allokere hukommelse korrekt i et CLR-miljø. Derefter tilføjes fire elementer af forskellig type ved hjælp af metoden Add(). Dette viser tydeligt ArrayLists evne til at håndtere heterogene data og duplikater.

For at udskrive indholdet bruges en IEnumerator. Dette er en standard måde at iterere gennem samlinger på i .NET-frameworket. I `while`-løkken hentes hvert element som en generisk `Object^`. Derefter bruges GetType() til at vise elementets faktiske datatype og dets værdi. Dette eksempel understreger, hvordan man arbejder med de generiske objekter, som en ArrayList indeholder.

Ofte Stillede Spørgsmål (FAQ)

Er ArrayList en del af C++ Standard Library?
Nej, det er den ikke. Den er en del af .NET-frameworkets samlingsbiblioteker og kræver, at man aktiverer Common Language Runtime (CLR) support i sit C++ projekt.
Hvornår skal jeg bruge ArrayList i stedet for `List<T>`?
I moderne C++-udvikling bør du næsten altid foretrække `List<T>`. ArrayList er primært relevant, når du arbejder med ældre kodebaser, der allerede bruger den, eller i meget sjældne tilfælde, hvor du absolut har brug for en samling med vidt forskellige objekttyper, og ydeevne ikke er en kritisk faktor.
Hvad betyder "boxing" og "unboxing"?
Boxing er processen med at konvertere en værditype (som `int` eller `float`) til en reference-type (en `Object`). Unboxing er den modsatte proces, hvor objektet konverteres tilbage til sin oprindelige værditype. Denne proces kræver ekstra hukommelsesallokering og processorkraft, hvilket gør ArrayLists langsommere end typesikre samlinger som `List<T>`.
Kan en ArrayList indeholde andre ArrayLists?
Ja, da en ArrayList kan indeholde enhver type `Object`, kan den også indeholde en anden ArrayList. Dette giver mulighed for at skabe komplekse, indlejrede datastrukturer. Den kan dog ikke direkte indeholde et flerdimensionelt array.

Hvis du vil læse andre artikler, der ligner C++ ArrayList: En Dybdegående Guide, kan du besøge kategorien Sundhed.

Go up