Tablica dynamiczna - funkcja, która zmienia rozmiar tablicy.

0
template <typename T>
void wektor<T>::resize(int newSize)
{
    T * newTab = new T[newSize];
    length = newSize < length ? newSize : length;
    for(int i = 0; i < length; i++)
        newTab[i] = tab[i];
    if(tab)
	delete [] tab;
    tab = newTab;
    length = newSize;
    if(last > length)
        last = length;
}

Coś chyba przy usuwaniu tab się wali. To się znajduje w klasie. last = to jeden element za tym, który jest ostatni dostępny. length to cały rozmiar tablicy. tab to ta tablica. Konstruktor to po prostu:

last = length = 0; tab = NULL; resize(10); 

Nie rozumiem dlaczego ten kod nie działa. Dokładniej to przy wywołaniu:

resize(length+1); 
1

#Dlaczego ta metoda przyjmuje inta? Zakladasz, ze mozna rozszerzyc wektor do ujemnej wartosci?
#Pomysl jak duza tablice przydzielasz.
#Pomysl ile iteracji wykonuje for.
#Pomysl dlaczego sprawdzasz czy tablica nie jest nullem po jej wykorzystaniu.

0
  1. Wierzę w swoją głupotę, że nie będę rozszerzał wektor do ujemnej wartości.
  2. Tak właściwie to tylko ją zwiększam lub usuwam całkiem, choć niby funkcja powinna być przystosowana także do zmniejszania rozmiaru.
  3. W moim przypadku, czyli gdy newSize > length to się wykonuje length razy. Nie przekraczam zakresu tablicy. Z kolei, jak bym zmniejszał, to by się wykonało newSize razy, gdyż wtedy byłaby to mniejsza wartość.
  4. Chodzi o konstruktor. W konstruktorze NULLuję tablicę, przez to nie mam na początku śmieci w niej.

Według mnie ten kod powinien działać w porządku, a co do przyjmowanego parametru to w zasadzie wystarczy na początku sprawdzić, czy nie jest mniejsza bądź równa zero i rzucić wyjątek w takim przypadku.

1
template<typename T> void wektor<T>::resize(size_t newLength)
  {
    T *newTab=new T[newLength];
    if(length)
      {
       size_t minLength=newLength<length?newLength:length;
       for(size_t i=0;i<minLength;++i) newTab[i]=tab[i];
       delete [] tab;
      }
    tab=newTab;
    length=newLength;
    if(last>length) last=length; // nie wiem co to jest i po kiego, ale to jakoś "śmierdzi"
  }
1

Parafrazując powyższe:

template<typename T> 
void wektor<T>::resize(size_t newLength)
  {
    T *newTab=new T[newLength];
    size_t copyLength = (std::min)(newLength, length); // zapytaj Microsoft dlaczego nawias

    if(length)
      {
       std::copy ( tab, tab + copyLength, newTab );
       delete [] tab;
      }

    tab = newTab;
    length = newLength;
    if(last >= copyLength) 
       last = copyLength - 1; // mi też to śmierdzi, albo ostatni element albo zmienić nazwę na "nextInsertPos"
  }

1 użytkowników online, w tym zalogowanych: 0, gości: 1