цикл не выполняется должным образом

c++

54 просмотра

1 ответ

я делал программу для практики с шаблонами и столкнулся со странной проблемой:

[code]
#include<iostream>
#include<new>
using namespace std;

template<class T>
class Vector {
private:
int Vector_Size;
T* Vector_Element;
int Free_Vector_Elements;
int Occupied_Vector_Elements;
int* Free_Element_List;
int* Occupied_Element_List;
public:
Vector() : Vector_Size(0), Vector_Element(0) {}
Vector(T Size) : Vector_Size(Size), Vector_Element(new T[Size]) {
    for (int Element = 0; Element < Vector_Size; ++Element) { Vector_Element[Element] = 0; }
}

~Vector() {
    delete[] Vector_Element;
    delete[] Free_Element_List;
    delete[] Occupied_Element_List;
}

T& operator[](int Element);
const T& operator[](int Element) const;

void Resize_Vector(int Rellocated_Size);
void Scan_Vector();
void Show_Vector_Info();
};

template<class T>
T& Vector<T>::operator[](int Element) { return(Vector_Element[Element]); }

template<class T>
const T& Vector<T>::operator[](int Element) const { return(Vector_Element[Element]); }

template<class T>
void Vector<T>::Resize_Vector(int Rellocated_Size) {
if (Rellocated_Size < Vector_Size) { cout << "Error:smaller size rellocated\n"; return; }
int Element;
T* Rellocated_Vector = new (nothrow) T[Rellocated_Size];
if (Rellocated_Vector == 0) { cout << "Error:memory could not be allocated\n"; return; }
for (Element = 0; Element < Vector_Size; ++Element) {
    Rellocated_Vector[Element] = Vector_Element[Element];
}
for (int Clear = 0; (Clear + Element) < Rellocated_Size; ++Clear) {  Rellocated_Vector[Clear + Element] = 0; }
delete[] Vector_Element;
Vector_Element = Rellocated_Vector;
Vector_Size = Rellocated_Size;
}

template<class T>
void Vector<T>::Scan_Vector() {
Free_Vector_Elements = 0;
Occupied_Vector_Elements = 0;
int Element, Free_Counter = 0, Occupied_Counter = 0;
for (Element = 0; Element < Vector_Size; ++Element) {
    if (Vector_Element[Element] == 0) { ++Free_Vector_Elements; }
    else if (Vector_Element[Element] != 0) { ++Occupied_Vector_Elements; }
}
Free_Element_List = new int[Free_Vector_Elements];
Occupied_Element_List = new int[Occupied_Vector_Elements];
for (Element = 0; Element < Vector_Size; ++Element) {
    if (Vector_Element[Element] == 0) { Free_Element_List[Free_Counter] = Element; ++Free_Counter; }
    else if (Vector_Element[Element] != 0) { Occupied_Element_List[Occupied_Counter] = Element; ++Occupied_Counter; }
}
}

template<class T>
void Vector<T>::Show_Vector_Info() {
if (Free_Vector_Elements != 0) {
    cout << "There are: " << Free_Vector_Elements << " free elements" << endl;
    for (int Element = 0; Element < Free_Vector_Elements; ++Element) {
        cout << "Element " << Free_Element_List[Element] << ": Free" << endl;
    }
}
if (Occupied_Vector_Elements != 0) {
    cout << endl;
    cout << "There are: " << Occupied_Vector_Elements << " occupied elements" << endl;
    for (int Element = 0; Element < Occupied_Vector_Elements; ++Element) {
        cout << "Element " << Occupied_Element_List[Element] << ": " << Vector_Element[Occupied_Element_List[Element]] << endl;
    }
}
}

int main() {
Vector<int> Test_Vector(5);
Test_Vector.Resize_Vector(10);
Test_Vector.Scan_Vector();
Test_Vector.Show_Vector_Info();
return 0;
}

[/code]

в строке 49 цикл for действует странно, т. е. когда я установил Clear в 0, программа выполняется должным образом, но после составления таблицы потока программ я заметил, что он должен также очистить 4-й элемент, что является нежелательным поведением, но это не так и, как ни странно, работает так, как будто он очищает пятый элемент, но когда я устанавливаю Clear в 1 элемент, 5 не очищается, и это смущает меня, почему? первая итерация цикла устанавливает Rellocated_Vector в элемент counter +, который равен 0 + 4 и должен теоретически очистить 4-й элемент, но он очищает 5-й, в чем причина?

Кроме этого, мои вопросы: - мой код понятен? - мой код чист? - Эффективна ли моя программа или я могу удалить некоторые детали, чтобы сделать ее лучше? -где я могу найти упражнения средней и высокой сложности с шаблонами, так как в основном те, которые я нахожу, слишком просты, или я делаю их сам, как приведенные выше, на создание которых уходит несколько часов.

Автор: globalturist Источник Размещён: 08.11.2019 11:20

Ответы (1)


-2 плюса

Я не кодировал в C Векторы, но я понимаю ваш код.

что касается вашего вопроса, это может быть из-за переменной обновления цикла (++ Clear) вместо (Clear ++)

проверить это до / после операторов

Автор: Rima Ibrahim Размещён: 20.08.2016 01:31
Вопросы из категории :
32x32