Avatar billede kernelx Juniormester
20. december 2006 - 10:41 Der er 6 kommentarer og
2 løsninger

new og delete[]

hi, jeg har følgende kode:
---
#include <iostream>
#include <fstream>
using namespace std;


class test
{
    private:
        unsigned int *array;

    public:
        test();
};

test::test()
{
    this->array = new unsigned int[5];

    this->array[0] = 5;
    this->array[1] = 5;
    this->array[2] = 5;
    this->array[3] = 5;
    this->array[4] = 5;

    this->array = new unsigned int[1];

    this->array[5] = 1;

    for (unsigned int i = i;  i < 6;  i++)
    {
        cout << this->array[i] << "\n";
    }

    delete[] this->array;
}

int main()
{
    test x;
}

---

jeg vil gerne have et array med "new"
array = new unsigned int[5];

så vil jeg gerne, at array'et bliver nogle værdier større - uden at jeg fordopler RAM-forbruget. altså uden

tmpArray = new unsigned int[6];
kopere fra array til tmpArray - og fylde tmpArray[5];

kan jeg på en eller anden måde sige til "array", at den skal blive 1 eller mere værdier større?
f.eks.: array = new unsigned int[1]; // array'et får et value mere

mit problem er, at jeg med meget store array's - hvis jeg koperer frem og tilbage -
har for meget RAM-forbrug.


med venlig hilsen
KernelX
Avatar billede jpk Nybegynder
20. december 2006 - 11:52 #1
Du kan ikke gøre et array større, det med at oprettet et nyt array og kopiere elementer er den gængse metode.

Du kan lave en datastruktur hvor du "linker" arrays sammen, hvis det er meget vigtigt for dig.
Avatar billede kernelx Juniormester
20. december 2006 - 11:57 #2
hvad laver realloc()? er det også sådan, at den koperer det hele intern?
Avatar billede lars314 Nybegynder
20. december 2006 - 12:25 #3
Du må ikke bruge de gamle C rutiner malloc, realloc og free sammen med de nye C++ rutiner new, delete og delete[].

Altså du må kun bruge realloc og free på ting lavet med malloc.

hvis jeg var dig vill jeg kigge lidt på std::vector

#include <iostream>
#include <fstream>
#include <vector>

using namespace std;


class test
{
    private:
        vector<int> array;

    public:
        test();
};

test::test()
    : array(5)
{
    array[0] = 5;
    array[1] = 5;
    array[2] = 5;
    array[3] = 5;
    array[4] = 5;

    array.resize(6);
    array[5] = 1;

    // eller evt. array.resize(6,1) istedet for de 2 foregående linier

    for (unsigned int i = i;  i < 6;  i++)
    {
        cout << array[i] << "\n";
    }

    delete[] this->array;
}

int main()
{
    test x;
}
Avatar billede kernelx Juniormester
20. december 2006 - 12:33 #4
og vektor koperer valuerne ikke intern?
Avatar billede jpk Nybegynder
20. december 2006 - 12:33 #5
lars314 >> det er en pænere og mere solid løsning at bruge vector, som du skriver. Internt laver den dog stadig kopieringstricket...
Avatar billede kernelx Juniormester
20. december 2006 - 12:37 #6
ok - mange tak for svarene.
husk begge at skrive svar pga. points
Avatar billede lars314 Nybegynder
20. december 2006 - 12:41 #7
Overvej en dequeue så.

Jeg mener ikke den kopierer hele tiden som en vector gør.

http://www.cppreference.com/cppdeque/index.html
Avatar billede jpk Nybegynder
20. december 2006 - 12:52 #8
Okay, takker...
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