我目前的作業分配讓我爲列表創建一個迭代器類。我被困在創建一個好的erase(iterator where)
函數。使用迭代器擦除容器元素
當前代碼(縮小到適合的問題):
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);
};
與擦除正在實施像這樣:
// 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;
}
前三隻情況下─元件,在開始處和結束元素元件 - 都可以。編碼良好,絕對不需要知識和私人訪問_Iter
的成員。但是,如果元素不在這些位置,那麼我(似乎)別無選擇,只能違反封裝並直接更改pCurr_(列表元素)。
有什麼辦法可以避免這種情況?我查看了STL列表,但他們使用了一些其他功能_Next_Node_(/* stuff */)
和_Prev_Node_(/* stuff */)
,這些功能對我來說並不是很有用。谷歌搜索給我如何使用擦除功能有用的結果,而不是如何自己寫。
問題:有沒有一種方法可以刪除我的迭代器指向的元素,而無需抓取它的pCurr_成員?
STL中的列表具有指向上一個節點和下一個節點的指針,所以_Next_Node和_Prev_Node_都是無用的。 – DumbCoder 2010-12-20 14:35:06
@DumbCoder:我不是毫無用處的,因爲它們「無用」,而是它不能幫助我理解實現擦除功能。 – IAE 2010-12-20 14:45:50