C++ realokacia pamate

Sekcia: Programovanie 12.01.2010 | 01:42
Avatar Ondrej Danko Debian | Fedora  Používateľ

cawte potreboval by som poradit ako v C++ realokovat pamat neco ako realloc() v C ;)

#include <iostream>
#include <vector>
#include <string>
using namespace std;

struct Data {

string sub;

struct Greats {
vector<string> def;
};

Greats greats;
};

int main() {
enum { ALLOC = 100, STEP = 10 };

// alokuje pamat
Data *data = new Data[ALLOC];

for (int i=0; i < ALLOC; i++) {
data[i].sub = "sub";

// zmaze vsetku pamat a nahradi ju novou vacsou...
// ako to zmenit, aby ju len rozsirilo?
data = new Data[ALLOC + STEP];

cout << i << ". " << data[i].sub;

for (int j=0; j < STEP; j++) {
data[i].greats.def.push_back("def");
cout << " : " << data[i].greats.def[j];
}

cout << endl;
}

delete [] data;
}
    • Re: C++ realokacia pamate 12.01.2010 | 01:47
      Avatar Ondrej Danko Debian | Fedora  Používateľ
      mam si navrhnut funkciu ktora cele pole objektov skopiruje do docasneho pola a potom to prehodi naspat uz rozsireneho?
      alebo mam si nastudovat STD alokatory?
      • Re: C++ realokacia pamate 12.01.2010 | 06:52
        Avatar Michal Nánási Ubuntu 11.04  Používateľ
        preci nepouzijes vector?
        Hi! I'm a .signature virus! Copy me into your ~/.signature to help me spread!
        • Re: C++ realokacia pamate 12.01.2010 | 08:18
          Avatar Ondrej Danko Debian | Fedora  Používateľ
          vlastne mas pravdu neuvedomil som si to ze vector moze mat aj vlastnu triedu(strukt)
          cize ked napisem

          // main()
          vector<Data> data;

          ako budem vkladat data do poloziek vnorenej struktury?
          • Re: C++ realokacia pamate 12.01.2010 | 08:49
            Avatar Michal Nánási Ubuntu 11.04  Používateľ
            data[47].greats.def[42]="the meaning of life, the universe, and everything";
            alebo data[47].greats.def.push_back("23") -- prida na koniec pola def 23.

            Alebo si sa pytal nieco ine?:-)

            Mozno otazka, naco si definoval triedu greats? def si mohol rovnako definovat vo vnutri triedy ako vector<string>
            Hi! I'm a .signature virus! Copy me into your ~/.signature to help me spread!
            • Re: C++ realokacia pamate 12.01.2010 | 10:00
              Avatar Ondrej Danko Debian | Fedora  Používateľ
              no potrebujem vnorenu triedu....kedze chcem mat vlastnu triedu na ukladanie udajov asi takto:
              trieda Data ......--> string subject;
              ..............->array[real] mark; // ulozenie znamok ktore patria subject
              ..............->array[string] def; // popis kazdej znamky
              ++ neake metody na vypocet napr priemeru atd

              no toto asi bez vnorenej neurobim :-D

              P.S. ten tvoj sposob nefunguje skusal som toto:
              vector<Data> data;
              data[0].sub = "math";
              cout << data[0].sub << endl;

              C++ vyvola vynimku Segmentation fault...proste potrebujem asi neco takehoto:
              data.push_back().sub = "string"
              data.push_back().greats.def.push_back("string");
              • Re: C++ realokacia pamate 12.01.2010 | 10:16
                Avatar Michal Nánási Ubuntu 11.04  Používateľ
                ako sa pouziva vector.

                Na zaciatku ma nulovu velkost (prazdne pole).

                T.resize(47) ho zvacsi na velkost 47

                T.push_back(a) vlozi na koniec prvok a;

                Segfault ti spravil preto, lebo to pole ma velkost 0 pristupujes niekam, kam nemas...

                spravne by malo byt data.sub.push_back("math")
                Hi! I'm a .signature virus! Copy me into your ~/.signature to help me spread!
                • Re: C++ realokacia pamate 12.01.2010 | 13:14
                  Avatar Ondrej Danko Debian | Fedora  Používateľ
                  diky moc ten resize pomohol ;)
                  #include <iostream>
                  #include <vector>
                  #include <string>
                  using namespace std;

                  struct Data {
                  string sub;

                  struct Greats {
                  vector<string> def;
                  };

                  Greats greats;
                  };

                  int main() {
                  vector<Data> data;
                  data.resize(100);
                  // data.sub.push_back("string"); nefunguje....
                  data[0].sub = "string";
                  data[0].greats.def.push_back("def");
                  cout << data[0].sub << endl;
                  cout << data[0].greats.def[0] << endl;
                  }