Generikus halmaz inserter függvénye miért nem működik int-re

Címkék
Generikus halmaz inserter függvénye miért nem működik int-re
2022-04-23T00:35:34+02:00
2022-04-23T19:38:56+02:00
2022-10-15T21:21:34+02:00
Silwex
Sziasztok!
Van egy kis problémám a következő feladattal. A beszúrás funkciónak működnie kell az int típusnál is, de sajnos nem működik. Mi lehet a probléma?
Itt van egy példa a függvényhívásra:

Set<int, 2> s0; s0.insert(1);


Ez egy 2 elemű tömb, aminek az első eleme 1

template <class T, size_t n = 10> class Set{ private: T adat[n]; public: size_t size (){return n;} bool isElement (T num){ for (size_t i = 0; i < n; i++) { if (adat == num) return true; } return false; } void insert (T data){ if (!isElement(data)){ size_t i = 0; while((adat != 0)||(i != n)) i++; if (i != n) adat = data; else throw("hiba"); } } };
Mutasd a teljes hozzászólást!
Én inkább így csinálnám:

template <class T, size_t n = 10> class Set{ private: T storage[n]; size_t actual_count = 0; public: size_t size (){return actual_count;} bool contains(T num){ for (size_t i = 0; i < actual_count; i++) { if (storage[i] == num) return true; } return false; } void insert (T data){ if (actual_count == n) throw("No more space left."); if (contains(data)) return; storage[actual_count] = data; actual_count++; } };
Mutasd a teljes hozzászólást!

  • Az eredeti megoldásod több sebből is vérzik.

    * Hogyan tárolsz 0 elemet?
    * hibás a while ciklus feltétele
    * a private 'adat' memóriaszemetet tartalmaz, nem töltődik fel magától 0-kal. (ahogy a kódod feltételezné)
    Mutasd a teljes hozzászólást!
  • Apró kiegészítés:

    void insert (T data){ if (actual_count == n) throw("No more space left.");
    Én amikor oktattam, külön kihangsúlyoztam, hogy ugyan a
    (actual_count == n)
    helyes, de mégis a

    (actual_count >= n)
    a javasolt írásmód.
    Jelen esetben, ahol egyetlen helyen változik a counter, annak belátása, hogy az egyenlőség megfelelő triviális, de egy sok száz-sok ezer soros osztályban már lehetségesek nem várt értékek is.
    Egy sokkal összetettebb logika esetén egy változó lehetséges értéktartománya nehezebben követhető, minden extra ellenőrzési lépés tiszta haszon.

    Példakódban (oktatási cél) nekem fontosak ilyen apróságok :)
    Mutasd a teljes hozzászólást!
  • Feltéve, hogy nem kapsz segmentation fault hibát addig, mert védett memóriaterületre írsz. Single thread-en ilyen eset (ha jó az implementáció) nem hiszem, hogy előfordulna, hogy nagyobb is lehet. Persze nem kizárt.
    Mutasd a teljes hozzászólást!
  • Vagy akár a sorrenddel is variálhatunk:

    if (contains(data)) return; if (actual_count >= n) throw("No more space left.");
    Mutasd a teljes hozzászólást!
Címkék
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd