Generikus dinamikus tömb készítése

Írjon generikus (template) dinamikus tömb (vector) osztályt, amely

§         Képes elemeket tárolni (insertAt), addig, amíg el nem fogy a memória. A függvény vegyen át egy pozíciót paraméterként, ahova beszúrja az új elemet, és ha az nagyobb, mint a tömb mérete, a keletkező üres helyeket a tárolt típus alapértelmezett értékével töltse fel!

§         Eltávolít (removeAt) egy adott pozíciójú elemet a tömbből

§         Meg tudja mondani egy elemről, hogy benne van-e a tömbben (isElement)

§         Az osztály legyen átadható érték szerint függvényparaméterként és az v1=v2=v3; értékadás működjön helyesen (v1, v2, v3 ugyanazzal a típussal példányosított vector template-ek)!

§         Milyen követelményeket támaszt az osztály a tárolandó típusokkal szemben (pl. alapértelmezett konstruktor rendelkezésre állása)?

Írjon egy egyszerű, maximum 10 utasításból álló programrészletet, amely bemutatja az osztály szolgáltatásainak használatát. Hibakezelést nem kell implementálnia!


A megoldásért kattints ide!

// Vector.h
#ifndef VECTOR_H
#define VECTOR_H

#include <iostream>
#include <exception>

// generikus dinamikus tomb osztaly
template<class T>
class Vector {
 unsigned elementNum; // a tomb merete
 T *pData; // az adatokra mutato pointer

public:
 // konstruktorok, destruktor
 Vector() { elementNum = 0; pData = 0; }
 Vector(const Vector &theOther) { pData = 0; *this = theOther; }
 ~Vector() { delete[] pData; }

 // beszur egy elemet a megadott indexu helyre
 // ha az index nagyobb, mint a tomb merete, megnoveli a tomb meretet,
 // és a szukseges uj helyeket nullakkal tolti fel
 void insert(unsigned position, const T &element);

 // torli a megadott indexu elemet, a 0 és size()-1 kozotti indexek ervenyesek
 void erase(unsigned position);

 // logikai igaz erteket ad vissza, ha az adott elem benne van a tombben
 bool isElement(const T &element) const;

 // ertekado operator felulirasa
 Vector &operator=(const Vector &theOther);
};


template<class T>
void Vector<T>::insert(unsigned position, const T &element) {
  // kezeljuk azt az esetet is amikor az utolso tag után szurjuk be az uj elemet
  unsigned NewSize = (position < elementNum) ? (elementNum + 1) : (position + 1);
  T *pTemp = new T[NewSize];

  for (unsigned i = 0, j = 0; j < NewSize; i++, j++) {
    if (j == position) {
      i--;
    } else {
      pTemp[j] = (i < elementNum) ? pData[i] : 0;
    }
  }

  pTemp[position] = element;
  delete[] pData;
  pData = pTemp;
  elementNum = NewSize;
}


template<class T>
void Vector<T>::erase(unsigned position) {
  if (position >= elementNum) {
    throw std::exception("Hibas index!");
  }

  // kezelnünk kell azt is amikor a vektor egyetlen elemét töröljük
  T *pTemp = elementNum > 1 ? new T[elementNum - 1] : 0;

  for (unsigned i = 0, j = 0; i < elementNum; i++, j++) {
    if (i == position) {
      j--; // a törlendő elemet nem másoljuk át
    } else {
      pTemp[j] = pData[i];
    }
  }

  delete[] pData;
  pData = pTemp;
  elementNum--;
}


// logikai igaz erteket ad vissza, ha az adott elem benne van a tombben
template<class T>
bool Vector<T>::isElement(const T &element) const {
 for (unsigned i = 0; i < elementNum; i++) {
  if (pData[i] == element) {
   return true;
  }
 }

 return false;
}


template<class T>
Vector<T> &Vector<T>::operator=(const Vector &theOther) {
  if (this == &theOther) {
    return *this;
  }

  delete[] pData;

  if ((elementNum = theOther.elementNum) == 0) {
    pData = 0;
  } else {
    pData = new T[elementNum];
    for (unsigned i = 0; i < elementNum; i++) {
      pData[i] = theOther.pData[i];
    }
  }

  return *this;
}


#endif // VECTOR_H



// Main.cpp
#include <iostream>
#include "Vector.h"
using namespace std;


int main() {
 int elements[] = {2, 7, 5, 9, 0, 1, 3};
 Vector<int> V1;

 for (unsigned i = 0; i < sizeof(elements) / sizeof(elements[0]); i++) {
  V1.insert(0, elements[i]);
 }

 Vector<int> V2 = V1;
 V1.erase(0);

 cout << V1.isElement(3) << endl;
 cout << V2.isElement(3) << endl;
 
 return 0;
}


// Kovetelmenyek a tarolando tipussal szemben:
// - legyen alapertelmezett konstruktora (tomb foglalasakor a default konstruktora hivodik meg a tipusnak)
// - az ertekado operator (operator=) helyesen mukodjon a tipussal
// - az egyenloseget vizsgalo operator(operator==) helyesen mukodjon a tipussal




2008.01.05. 11:13:47 |  Permalink  |  Hozzászólások száma: 0  |  Tárgyszavak: Sablonok


Írja meg Ön is véleményét!


Hozzászólásokat csak regisztrált, bejelentkezett felhasználóktól tudunk elfogadni!

Hozzászólások