私の現在の宿題は、リストのイテレータクラスを作成しています。私は良いerase(iterator where)
関数を作成に固執しています。イテレータを使用してコンテナ要素を消去する
(質問に合わせて縮小)現在のコード:唯一の要素cases-
// Precondition: List has been checked for size > 0.
List::iterator List::erase(List::iterator& where)
{
// Erasing only element in list.
if(where == end() && where == begin())
{
pop_back(); // or pop_front();
return iterator(0, this);
}
// Elem at end
if(where == end())
{
pop_back();
return end();
}
else
{
// Elem at beginning
if(where == begin())
{
pop_front();
return ++begin();
}
}
// Elem somewhere between beginning and end.
iterator temp(where);
// The node next to pCurr_ should point to the one before pCurr_
where.pCurr_->next->prev = where.pCurr_->prev;
// The node before pCurr_ should point to the one after pCurr_
where.pCurr_->prev->next = where.pCurr_->next;
// Return the node after pCurr_
++temp;
delete where.pCurr_;
--size_;
return temp;
}
最初の3、冒頭に終了し、要素の要素:消去がそうのように実装されていると
class List
{
class _Iter
{
friend class List;
public:
_Iter(ListElem *pCurr, List *pList);
/* *, ->, ++, --, == and != operators overloaded */
private:
ListElem *pCurr_; List *pList_;
};
typedef _Iter iterator;
iterator erase(iterator where);
};
- 大丈夫ですか?コード化され、_Iter
のメンバーへの知識と私的アクセスは絶対に必要ありません。しかし、要素がそれらの位置にない場合は、カプセル化に違反してpCurr_(リストの要素)を直接変更するという選択肢はありません。
これを避ける方法はありますか?私はSTLのリストを調べましたが、他の関数_Next_Node_(/* stuff */)
と_Prev_Node_(/* stuff */)
を使っていましたが、あまり役に立たないものでした。 Google検索では、自分自身で書き込む方法ではなく、消去機能の使い方に関する有用な結果が得られます。
質問:pCurr_メンバーを取得せずにイテレータが指す要素を消去できる方法はありますか?
STLのリストには、前のノードと次のノードの両方へのポインタがあるため、_Next_Nodeと_Prev_Node_は役に立たないわけではありません。 – DumbCoder
@DumbCoder:「役に立たない」という意味ではなく、消去機能の実装を理解するのに役立たないという意味でした。 – IAE