Figure 3: slist erasures

    iterator erase(iterator _Where)
        {       // erase element at _Where
        _Erase(_Where._Mypnode());
        return (_Where); }

    iterator erase(iterator _First, iterator _Last)
        {       // erase [_First, _Last)
        for (bool _Done = _First == _Last; !_Done; )
            {       // erase _First, testing _Last before it dies
            if (&_Next(*_First._Mypnode()) == _Last._Mypnode())
                _Done = true;
            erase(_First); }    // _First points to next 
                                // after erase
        return (_First); }

    void _Erase(_Nodeptr *_Ppnode)
        {       // erase element at _Pnode
        if (*_Ppnode != 0)
            {       // not off end, safe to erase
            _Nodeptr _Pnode = _Next(*_Ppnode);
            if (_Pnode == 0)
                _Tail = 0;      // erasing tail, new tail unknown

            _Mybase::_Alval.destroy(&_Myval(*_Ppnode));
            _Freenode(*_Ppnode);
            *_Ppnode = _Pnode;
            --_Mysize; }}