2016-08-20 1 views
-1

を実行すると奇妙な問題が発生したではない:行49では、ループのために、私はテンプレートで練習するプログラムを作っていた適切

[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] 

をforループすなわち奇妙な行為:私は0にクリアしたときにプログラムが正常に実行されますプログラムの流れのテーブルを作成した後、私はそれも4番目の要素を消去しなければならないことに気付きましたが、これは望ましくない動作ですが、5番目の要素をクリアするかのように機能しません。私はなぜそれを混乱させるのか?最初のループの反復 は、0 + 4のcounter + elementにRellocated_Vectorを設定し、理論上は4番目の要素をクリアする必要がありますが、理由は何ですか?

それ以外の質問は次のとおりです。 - 私のコードはわかりますか? -私のコードはきれいですか? -私のプログラムは効率的ですか、それを改善するために特定の部分を削除できますか? - テンプレートでは中程度から高い難易度の練習問題を見つけることができますが、私が見つけたものはほとんど簡単です。あるいは、私は自分自身を上記のようにして、何か挑戦的なことを考え出すのに数時間かかります。

+0

バグを解決したら、あなたの

チェックその他の質問は、[コードレビュー](http://codereview.stackexchange.com/)に掲載する必要があります。 – Quentin

+0

ようこそStackoverflowへ。このプログラムにバグがある場合は、そのバグを示す[最小、完全、かつ検証可能な例]を作成してください。このコードはそれをしません。次に、デバッガを使用して にあなた自身のバグを識別させてください。できない場合は、MVCEに質問を投稿してください。また、Stackoverflowで一度に1つの質問。 –

+0

理解済みです!私はこの1つの次回のような投稿をしません – globalturist

答えて

-2

私はCのベクトルでコードを削除しましたが、私はあなたのコードを理解しています。

それが原因でループ更新変数(++クリア)であるかもしれないあなたの質問のためとして

代わりに(クリア++)のこのうち Pre/Post Operators

+0

情報ありがとう! – globalturist

+1

forループの3番目のセクションで '++ x'または' x ++ 'を使用するかどうかは関係ありません。 – 5208760

関連する問題