현재 숙제를 사용하면 목록에 대한 반복기 클래스를 만들 수 있습니다. 좋은 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 */)
을 사용했다. Google 검색을 사용하면 직접 지우는 방법이 아니라 지우기 기능을 사용하는 방법에 대한 유용한 결과를 얻을 수 있습니다.
질문 : iterator가 가리키는 요소를 pCurr_ 멤버를 갖지 않고 지울 수있는 방법이 있습니까?
STL의 목록에는 이전 노드와 다음 노드 모두에 대한 포인터가 있으므로 _Next_Node 및 _Prev_Node_는 쓸모가 없습니다. – DumbCoder
@DumbCoder : "쓸모가 없다"는 의미는 아니지만 지우기 기능 구현에 대한 이해를 돕지 못했습니다. – IAE