2012-03-15 13 views
0

Stackを使用して実装されたテンプレート化されたクラスのend関数の記述は、配列の境界を越えて実装されるとどのくらい正確になりますか?テンプレート付きスタックを使用したイテレータの記述

これは私の現在のエンド()関数です:

template<typename T> 
StackIterator<T> Stack<T>::end() const 
{ 
    //iterator takes a stack and an item of type <T> 
    StackIterator<T> goodBye(*this, items[-1]); 
    return goodBye; 
}//end end function 

この現在の実装では、プリミティブ型のために動作しますが、文字列で使用されるメモリの場所で bad_alloc(...)をスローします。

これをもっと多目的にする方法についてのアイデアはありますか?

答えて

0

items[-1]であってはなりません。サイズnの配列の場合は、items[n]である必要があります。 C++ 11では、このジョブを実行できるstd::endが見つかります。

もちろん、std::stackを使用することもできますが、ねえ。

編集:プレーンな意味での反復は、一方向のネイティブ配列でのみ機能します。ネイティブ配列を逆方向に反復したい場合は、前方の[begin, end)の範囲から開始し、そこから逆の反復を実装する必要があります。

+0

しかし、これは、上から下に行くのとは対照的に、スタックの下から上に向かって繰り返すことを意味します。そして、std :: stackを使うことができることは分かっていますが、宿題はゼロからすべて作成することでした。 – D1990c

+0

@ D1990c:あなたの実装はその方向性を逆転させるべきです。配列は進む。 –

+0

配列がどの方向にトラバースされているかにかかわらず、配列にすべての位置に要素がある場合、これを実行しようとすると同じエラーが発生します – D1990c

関連する問題