0

ここにいくつかの背景があります。私は二分木反復子を持っています(順番に言ってください)。スタックの一番上にポインターをプッシュすることで、現在のノードの親ノードを追跡しています。今、相互運用性、つまり にキャストできる機能も必要iteratorですconst_iterator。しかし、iteratorありstd::stack<pointer>const_iteratorありますstd::stack<const pointer>

同じ効果を達成する他の方法も高く評価されます。

編集

std::stack現在、私は完全に使用するという考えを捨てています。私は+ +を使用std::dequeしています。に変換するために、私は を使用しているだけで、このセットアップは単純に機能します。push_back()pop_back()back()std::deque<pointer>std::deque<const pointer>std::copy( std::begin(ptrDeque), std::end(ptrDeque), std::begin(constPtrDeque) );

好奇心から、この質問への回答を引き続き希望します。

4

2 に答える 2

1

const_iterator に非 const スタックを保持するだけです。これはプライベート データ メンバーなので、特に問題はありません。

const_iterator の実装がポインターを介して変更されていないことを確認してください。念のため、常に const 参照を返す const_iterator 独自の operator*() を使用してください。(実際には、ポインターを逆参照する必要はあまりないと思いますが、そうする場合は、そのようにする必要があります。)

于 2012-10-02T05:54:39.090 に答える
0

C++でこの種の変換を行う簡単な方法はありません。キャストで十分なようですが、このようには機能しません。

C ++の方法は、重要なデータ構造を隠し、さまざまなAPIによるアクセスを管理することです。はい、それはある時点であなたがconst望むよりも少ないことを意味します。しかし、それが隠蔽の目的です。それが実装にのみある限り、他の誰もそれを誤用することはできません。

vectorスタック/両端キュー/その他[十分だと思います]を専用のクラスにカプセル化すると、目的のソリューションにかなり近づくことができます。内部的には非constポインターを保持しますが、すべてのconstメソッドはconst pointersを返します。constイテレータがゲッターを介してのみアクセスする場合、誤ってバイパスすることは不可能です。

于 2012-10-02T07:34:06.297 に答える