Kezdőoldal » Számítástechnika » Programozás » Dinamikus tömb méretét megvált...

Dinamikus tömb méretét megváltoztatni nem lehet C++-ban szabványosan?

Figyelt kérdés

Egy C++ tanárom szerint ez a kód nem szabványos. De akkor mit kell használni helyette?


int* t;

int n;

cin >> n;

t = new int[n];

//satobbi

delete[] t;


cin >> n;

t = new int[n];



2019. máj. 9. 16:30
 1/10 anonim ***** válasza:

A C++ nyelvben szigorúan véve nem létezik a dinamikus tömb fogalma. Deep down, minden tömb statikus méretű, és nem lehet csak úgy növelni a méretét anélkül, hogy a teljes tömböt újraallokálod a memóriában (maximum alacsony szintű feketemágiával, amit viszont távol érzek a 'szabványos' alkalmazástól). Nem látom, hogy mi lenne ebben a kódban "nem szabványos" azon kívül, hogy millió meg egy beépített container osztály van, ami leveszi a válladról a dinamikus tömbkezelés terhét (vector,queue,deque, stb). Ami tényleg NEM lenne szabványos C++ kód, az ez:


int n;

cin>>n;

int t[n];


A te kódod nekem teljesen jónak tűnik.

2019. máj. 9. 17:36
Hasznos számodra ez a válasz?
 2/10 anonim ***** válasza:

C++-ban annyira nem vagyok jártas (de dolgoztam már benne). Nem tudom mi a szabványos eljárás, ez szerintem függ sok mindentől is. Azonban én biztos, hogy nem használnék primitív típust tömbként. Létrehoznék egy láncolt listát, ami mondjuk teljesen általános típust tudna tárolni az alkalmazásom szempontjából. És ebből hoznék létre olyan konkrét típusokat, amire mondjuk szükségem van. Például egy listát könyvekről, vagy autókról, emberekről, akármiről, amit el tudsz képzelni.


Itt egy példa rá: [link]


A lényeg itt van: "list->add(rand() % 100);"


Nem érdekes milyen hosszú az adatsorod, amit tárolni szeretnél, a láncolt lista elintézi neked a memóriafoglalást (ebben a példában ez pontosan a 36. sorban történik meg), kezelheted könnyen az adataidat (ha akarod akár egy Iterator mintát is alkalmazhatsz rá, így könnyű lesz végigszaladni és meghatározott feltételeket alkalmazni a listára - [link] de ha már nincs szükséged az adatra, a memória felszabadítását is ezen a listán keresztül tudod megtenni.

2019. máj. 9. 17:43
Hasznos számodra ez a válasz?
 3/10 anonim ***** válasza:

A kódod szabályos, de nem azt csinálja, amit szeretnél. Nem átméretezi a tömböt, hanem törli, és egy üreset hoz létre helyette. Ha átméretezni szeretnéd, lehet rá függvényt írni, létrehozol egy temp tömböt, átmásolod a tartalmat oda, törlöd a régit, újat hozol létre, és utána visszamásolod oda a temp tartalmát.

De ha dinamikusan szeretnél tömbbel foglalkozni, javaslom az std::vector generikus osztályt, az mindent megold helyetted ilyen téren.

2019. máj. 9. 17:55
Hasznos számodra ez a válasz?
 4/10 anonim ***** válasza:

#2 Nem igazán látom miért lenne több értelme listaszerkezetet alkalmazni csak azért, mert primitív típusról van szó. A láncolt listás szerkezet ebben az esetben szinte kizárólag hátrányokkal járna:

1. Arányaiban véve jelentős memóriatöbblet, minden integer mellé még egy pointer típust is le kell tárolni (ami rendszerint integer méretű), effektíve duplázva a használt memóriát

2. Közvetlen elérés lassabb lesz, mivel csak a listán végiglépkedve tudsz egy adott indexű elemet elérni.


Az egyetlen lényegi előnye, hogy dinamikusan bővíthető, elemek beszúrása/eltávolítása gyorsabb lesz. Ami nagyon hasznos, feltéve hogy az adott program sűrűn végezne majd ilyen műveleteket. De ez nem tudom hogyan kapcsolódik a tárolni kívánt típushoz.

2019. máj. 9. 18:00
Hasznos számodra ez a válasz?
 5/10 A kérdező kommentje:
3#: igen, élesben nyilván át kellene másolni a tömbben lévő adatokat. Ez csak egy ilyen nagyon rövid szemléltető példa akart lenni, amibe ezt nem írtam bele hirtelen. De végülis jogos az észrevétel, mert netalántán valaki más olvassa, aki esetleg nem gondol erre.
2019. máj. 10. 09:39
 6/10 anonim ***** válasza:

(Hibakezelés amit egy gyakorlati kódban kéne kezelni.

Sikerült e a tömb létrehozása stb.

)

Nem szabványos végül is hogy a végén nem szabadítod fel a létrehozott tömböt.


" millió meg egy beépített container osztály van, ami leveszi a válladról a dinamikus tömbkezelés terhét (vector,queue,deque, stb). "

Azok template-ek és nem osztályok. Az azokból létrehozott tényleges használt típusok az osztályok.

2019. máj. 10. 18:22
Hasznos számodra ez a válasz?
 7/10 anonim ***** válasza:
#6 Kákán a csomó.
2019. máj. 10. 19:52
Hasznos számodra ez a válasz?
 8/10 anonim ***** válasza:

#6


class template, csak mert template van class template, function template, alias template, variable template, meg C++20-tol concept cuccoknal is van.

2019. máj. 11. 21:29
Hasznos számodra ez a válasz?
 9/10 anonim ***** válasza:
Köszönjük a pontosítást.
2019. máj. 13. 12:42
Hasznos számodra ez a válasz?
 10/10 A kérdező kommentje:

#6: mondtam, hogy ez csak egy hirtelen leírt rövid példa :D

Nyilván élesben a végén is lenne delete[] t;

2019. máj. 14. 09:43

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!