Avatar billede strato Nybegynder
27. februar 2002 - 12:45 Der er 15 kommentarer og
1 løsning

Dynamisk resize et array i C++ ?

C++

Jeg ved at man kan resize et array ved at kopiere det over i et nyt.

Jeg har en klasse "myClass" der har en pointer *p til
et arrat med "myItems", i konstruktøren allokerer jeg
plads til 10 elm:
*p = new myItems<Type>[10];
når jeg senere hen finder ud af jeg ikke længere vil have plads til 10, men 20 - og min pointer p tilhørende klassen skal pege på det nye array, hvad gør jeg så?
Jeg har prøvet noget lign.(uden held):

void kopier() {
  *bigP = new myItems<Type>[20];
    for( int i=0; i<10; i++)
      bigP[i] = p[i];
    *p = bigP;
}

(Og nej, jeg kan ikke bruge en vector ... :-(

Avatar billede jpk Nybegynder
27. februar 2002 - 12:47 #1
Det du er ved at lave er jo en vector!!!
Avatar billede jpk Nybegynder
27. februar 2002 - 12:48 #2
Forresten er det alt for mange point for så simpelt et spørgsmål!
Avatar billede wisen Nybegynder
27. februar 2002 - 12:58 #3
... Hvorfor er det, at du ikke kan bruge en vector eller for den sags skyld en list ?
Avatar billede henrik_ffc Nybegynder
27. februar 2002 - 13:03 #4
#include <iostream.h>
#include <string>

template <class T>
class Array
{
        public:
                Array();                      // tillader    arr Array;
                Array(int n);                // tillader    arr Array(5);
                ~Array();
                void redim(int n);            // tillader    arr.redim(10)
                T operator[](int i) const;  // tillader    cout << arr[5];
                T& operator[](int i);      // tillader    arr[5] = 32;

                int antal;
                T *data;
};

template <class T>
Array<T>::Array()
{
        antal=0;
}

template <class T>
Array<T>::Array(int n)
{
        antal=n;
        data = new T[n];
}

template <class T>
Array<T>::~Array()
{
        delete[] data;
}

template <class T>
void Array<T>::redim(int n)
{
        T *temp = new T[n];
        int max=(antal < n ? antal : n);
        for (int i=0; i<max; i++)
                temp[i] = data[i];
        antal = n;
        delete[] data;
        data = temp;
}

template <class T>
T Array<T>::operator[](int i) const
{
        return data[i];
}
               
template <class T>
T& Array<T>::operator[](int i)
{
        return data[i];
}

int main()
{
        Array<std::string> test(5);
        for(int i=0; i<5; i++) test[i]= "test1"; // definer de første 5 (0-4)

        test.redim(10);

        for(int i=5; i<10; i++) test[i]="testx"; // definer 5-9
        for(int i=5; i<10; i++) test[i]=test[10-i]; // omdefiner 5-9

        cout << "Antal i array : " << test.antal << endl; // udkskriver antallet i arrayet
        for(int i=0; i<10; i++) cout << i << " : " << test[i] << endl; // udskriv 0-9
        cout << endl;
       
        test.redim(5); // redim til 5

        cout << "Antal i array : " << test.antal << endl; // udkskriver antallet i arrayet
        for(int i=0; i<test.antal; i++) cout << i << " : " << test[i] << endl; // udskriv alle
        cout << endl;

        int ind; cin >> ind; // Venter til et tal indtastes
}
Avatar billede jpk Nybegynder
27. februar 2002 - 13:06 #5
Ja, hvorfor kan du ikke bruge en vector?
Avatar billede emileej Nybegynder
27. februar 2002 - 15:24 #6
Hmmm - nu har jeg sidderog tygget lidt på alt det i har skrevet...
Begreber, jeg ikke ku sluge:
vector (øhh? sådan een med en på virkning i hhv. x og y retningen? *gG*) og list (er det bare et array eller???)...

Jeg kan jo ozz oprette et spørgsmål med pointz, hvis i vil det, men dette spørgsmål mangler vist ikke pointz *gG*

E-)mil
http://mfp.eej.dk
http://eej.dk
Avatar billede henrik_ffc Nybegynder
27. februar 2002 - 15:28 #7
En list er bare en række elementer der er kædet sammen af pointere.
En vector er et array, der dynamisk kan udvides og formindskes
Avatar billede jpk Nybegynder
27. februar 2002 - 15:30 #8
>> emileej
Nej, ikke en geometrisk vector (som jo iøvrigt heller ikke er begrænset til x og y)

Begrebet dækker her over implementationen af et dynamisk array der kan indholde std typer eller objekter af forskellig type.

En liste er typisk ikke implementeret som et array, men som separate objekter der er hægtet sammen via pointers i én eller begge retninger.
Avatar billede emileej Nybegynder
27. februar 2002 - 15:34 #9
Så en vector er altså en bred betegnelse, for klasser der beskriver et array af en vilkårlig type (også instanser af egne klasser?), men ikke følger med i noget std. bibliotek.
Og en liste er bare et net af pointers imellem objekter...
Korrekt?
Avatar billede jpk Nybegynder
27. februar 2002 - 15:50 #10
Mere eller mindre, ja.

Dog ligger der en vector i C++'s standard bibliotek! (std::vector)
Ligesom der også ligger en liste + meget andet...
Avatar billede emileej Nybegynder
27. februar 2002 - 15:53 #11
Damn! I alle compilere?
Avatar billede jpk Nybegynder
27. februar 2002 - 16:00 #12
Altså, det ligger jo ikke i compileren...
Men det er noget "forholdsvist" nyt, så du vil sikkert ikke finde det i ældre udviklingsmiljøer!
Avatar billede henrik_ffc Nybegynder
27. februar 2002 - 16:08 #13
Strato>> Kan du bruge mit alternativ?
Avatar billede emileej Nybegynder
27. februar 2002 - 16:12 #14
i gcc for eksempel?
Avatar billede jpk Nybegynder
27. februar 2002 - 16:15 #15
Det er jo egentlig lige meget hvad det er for en compiler, bare du har de libs du skal bruge!
Avatar billede strato Nybegynder
27. februar 2002 - 16:40 #16
Jeps, jeg har læst dit svar og set at det er nøjagtigt det samme jeg foretager mig - blot uden en template klasse til Array's ...
Så fejlen må ligge andetsteds :-(

Men tak for de mange kommentarer!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester