IT-Academy Logo
Sign Up Login Help
Home - Programmieren - ArrayList in C++



ArrayList in C++

Eine einfache C++-Klasse für die Verwaltung eines dynamischen Arrays.


Autor: Patrick Bucher (paedubucher)
Datum: 26-07-2005, 19:17:10
Referenzen: keine
Schwierigkeit: Fortgeschrittene
Ansichten: 13116x
Rating: 8 (1x bewertet)

Hinweis:

Für den hier dargestellte Inhalt ist nicht der Betreiber der Plattform, sondern der jeweilige Autor verantwortlich.
Falls Sie Missbrauch vermuten, bitten wir Sie, uns unter missbrauch@it-academy.cc zu kontaktieren.

[Druckansicht] [Als E-Mail senden] [Kommentar verfassen]



/*
 * myList - Version 0.02
 *
 * (c) 2005 by paedubucher
 *
 * Eine einfache C++-Klasse, welche eine minimale ArrayList für vorzeichenlose
 * Integers darstellt. Es können dabei Zahlen von 0 bis zur Integer-Obergrenze
 * gespeichert werden.
 *
 */

// Struktur für die Speicherung eines Werts
struct Value
{
public:
    Value *vluNext; // Zeiger auf das nächste Element
    unsigned int intValue; // Wert
};

// Eine einfache ArrayList für Zahlen von 0 bis zur Integer-Obergrenze
class List
{
private:
    Value *vluFirst; // letztes Element der Liste
    Value *vluLast; // letztes Element der Liste
    unsigned int intCount; // Anzahl Elemente in der Liste

    // Gibt den Listeneintrag mit dem übergebenen Index zurück
    Value *getValue(unsigned int intIndex) const
    {
        unsigned int n = 0;
        Value *vluTemp = this->vluFirst; // erstes Element

        // Index im gültigen Bereich?
        if(intIndex < this->intCount)
        {
            // vluTemp um intIndex verschieben
            for(; n < intIndex && vluTemp->vluNext != 0; n++)
                vluTemp = vluTemp->vluNext; // nächstes Element
        }

        return (vluTemp); // Rückgabe von 0 bedeutet ungültigen Index!
    }

public:
    // Konstruktor
    List()
    {
        this->vluFirst = 0;
        this->vluLast = 0;
        this->intCount = 0;
    }

    // hängt der Liste einen neuen Eintrag mit dem übergebenen Wert an
    void add(unsigned int intNewValue)
    {
        Value *vluNew = 0;

        // neues Element erstellen
        vluNew = new Value;
        vluNew->intValue = intNewValue;
        vluNew->vluNext = 0;

        if(this->vluFirst == 0)
        {
            // erstes Element
            this->vluFirst = vluNew;
            this->vluLast = vluNew;
        }
        else
        {
            // anhängen
            this->vluLast->vluNext = vluNew;
            this->vluLast = vluNew;
        }

        this->intCount++; // Anzahl der Listenelemente erhöhen
    }

    // gibt den Wert des Elements mit dem übergebenen Index zurück
    int get(unsigned int intIndex) const
    {
        int intRet = -1// Dummy-Wert
        Value *vlu = 0;

        // Index gültig?
        if(intIndex < this->intCount)
        {
            vlu = this->getValue(intIndex); // Listeneintrag suchen
            if(vlu != 0)
                intRet = vlu->intValue; // Wert speichern
        }

        return (intRet);
    }

    // setzt den Wert eines Listeneintrags mit dem übergebenen Index
    void set(unsigned int intIndex, unsigned int intNewValue)
    {
        Value *vlu = 0;

        // Index gültig?
        if(intIndex < this->intCount)
        {
            vlu = this->getValue(intIndex); // Listeneintrag suchen
            if(vlu != 0)
                vlu->intValue = intNewValue; // Wert setzen
        }
    }

    // Anzahl zurückgeben
    int getCount() const
    {
        return (intCount);
    }
};


Dani
Senior Member
Beitrag vom:
10-08-2005, 20:50:41

Aus *dem* C++-Buch (also dem von Stroustrup)

ich hab das Kapitel über Typen vor kurzem gelesen, deshalb erinner ich mich an diese Stelle (§4.4):

"Die vorzeichenlosen Typen sind ideal für die Anwendung als Bitfeld. Ein unsigned anstatt eines inz zu benutzen, um ein Bit mehr zur Darstellung positiver Zahlen zu erhalten, ist fast immer eine schlechte Idee."

-----------------------------------------------------
\"I have to share the credit. I may have invented it, but I think Bill made it famous. -- When he used it for the NT logon, that\'s what I meant. okay?\" (David Bradley über Ctrl-Alt-Del)


paedubucher
Professonial
Beitrag vom:
07-08-2005, 15:47:54

warum beschränken?

Meine Klasse kann zwar nicht mit negativen Integers umgehen, dafür kann sie mit dem gleichen Speicherplatz grössere Ganzzahlen aufnehmen ;-)

Für die praktische Verwendung würde man natürlich ein Template definieren, der Sinn der Klasse ist es aber nur, eine verkettete Liste zu abstrahieren. Welchen Datentyp man dafür aussucht, ist eigentlich relativ egal...

-----------------------------------------------------


incsoft
Professonial
Beitrag vom:
07-08-2005, 12:19:09

Beschränkung auf unsigned int

Hi paedubucher,

warum beschränkst du den Einsatzbereich deiner Klasse auf unsigned int?

-----------------------------------------------------


paedubucher
Professonial
Beitrag vom:
02-08-2005, 22:44:11

@ wendy

Na klar, sowas vergisst man bei den heutigen modernen Programmiersprachen schnell ;-)

Ich musste leider noch feststellen, dass ich durch den gewaltigen Java und .Net Einfluss alle Methoden inline definiert habe. Ich werde das ganze dann noch einmal überarbeiten, dann implementiere ich vielleicht auch die Grenzwerte irgendwie...

-----------------------------------------------------


wendy
Rookie
Beitrag vom:
02-08-2005, 22:00:10

new

// neues Element erstellen
vluNew = new Value;

da kein new-handler gesetzt ist kann vluNew danach auch NULL sein, falls das Anlegen fehlschlaegt.
Ansonsten schaut es schon viel besser aus ;-)

-----------------------------------------------------


paedubucher
Professonial
Beitrag vom:
30-07-2005, 14:43:50

@ wendy

Danke für die Anregungen

Folgendes:
Ein paar Anmerkungen:
- intTop wird zu spaet gesetzt. (nach Aufruf von setBottom => setBottom funktioniert nicht)

>richtig, da hätte ich wohl besser testen sollen

- es fehlen ein paar const's bei den Signaturen (int get() const etc.)

>Anfängerfehler ;-)

- sollten Indizes nicht unsigend int sein?

>nicht nur Indizes, sondern auch die Werte! Es ist lediglich eine ArrayList für positive Integers...

- Fehlerbehandlung (bei new) fehlt absichtlich?

> was meinst du mit "new"?

Den Rest werde ich überarbeiten...

-----------------------------------------------------


wendy
Rookie
Beitrag vom:
30-07-2005, 09:48:59

Leider funktioniert "Artikel bewerten" bei meinen Browsern nicht...

Ein paar Anmerkungen:
- intTop wird zu spaet gesetzt. (nach Aufruf von setBottom => setBottom funktioniert nicht)
- es fehlen ein paar const's bei den Signaturen (int get() const etc.)
- sollten Indizes nicht unsigend int sein?
- Fehlerbehandlung (bei new) fehlt absichtlich?

-----------------------------------------------------


picard
Professonial
Beitrag vom:
28-07-2005, 17:11:09

hoppla

ich seher außerdem, dass der Code die Seite etwas sprengt bei 1024x768. hmm, dies werde ich noch demnächst anpassen...

-----------------------------------------------------
"...denn wir arbeiten nicht nur um uns selbst zu verbessern, sondern auch den Rest der Menschheit!"


paedubucher
Professonial
Beitrag vom:
27-07-2005, 21:53:15

ups...

Das hätte ich wohl noch beachten sollen :-(

Aber ich surfe "leider" nur noch mit Firefox, ich weiss gar nicht mehr, wie man den IE öffnet :-P

-----------------------------------------------------


picard
Professonial
Beitrag vom:
27-07-2005, 20:00:34

bah!

Ich hab leider die Farben rausnehmen müssen, da die Software eines bekannten Monopolisten scheinbar nicht mit xml umgehen kann. Pfft...

-----------------------------------------------------
"...denn wir arbeiten nicht nur um uns selbst zu verbessern, sondern auch den Rest der Menschheit!"


[back to top]



Userdaten
User nicht eingeloggt

Gesamtranking
Werbung
Datenbankstand
Autoren:04503
Artikel:00815
Glossar:04116
News:13565
Userbeiträge:16551
Queueeinträge:06236
News Umfrage
Ihre Anforderungen an ein Online-Zeiterfassungs-Produkt?
Mobile Nutzung möglich (Ipone, Android)
Externe API Schnittstelle/Plugins dritter
Zeiterfassung meiner Mitarbeiter
Exportieren in CSV/XLS
Siehe Kommentar



[Results] | [Archiv] Votes: 1137
Comments: 0