2013-05-02 2 views
0

У меня есть следующий класс List:определения местоположения, является ли членом определенного списка

typedef int Elem;    // list base element type 
    class NodeList {    // node-based list 
    private: 
    struct Node {    // a node of the list 
     Elem elem;    // element value 
     Node* prev;    // previous in list 
     Node* next;    // next in list 
    }; 
    public: 
    class Iterator {    // an iterator for the list 
    public: 
     Elem& operator*();   // reference to the element 
     bool operator==(const Iterator& p) const; // compare positions 
     bool operator!=(const Iterator& p) const; 
     Iterator& operator++();   // move to next position 
     Iterator& operator--();   // move to previous position 
     friend class NodeList;   // give NodeList access 
    private: 
     Node* v;     // pointer to the node 
     Iterator(Node* u);   // create from node 
    }; 
    public: 
    NodeList();     // default constructor 
    int size() const;    // list size 
    bool empty() const;    // is the list empty? 
    Iterator begin() const;   // beginning position 
    Iterator end() const;   // (just beyond) last position 
    void insertFront(const Elem& e);  // insert at front 
    void insertBack(const Elem& e);  // insert at rear 
    void insert(const Iterator& p, const Elem& e); // insert e before p 
    void eraseFront();    // remove first 
    void eraseBack();    // remove last 
    void erase(const Iterator& p);  // remove p 
    private:     // data members 
    int  n;     // number of items 
    Node* header;    // head-of-list sentinel 
    Node* trailer;    // tail-of-list sentinel 
    }; 

Мой код не делает любой проверки, чтобы определить, является ли данная позиция (объект итератора) на самом деле является членом конкретный список. Например, если p является позицией в списке S, и я вызываю T.insert (p, e) в другом списке T, тогда я бы фактически добавлял элемент к S непосредственно перед p. Как я могу изменить свою реализацию NodeList, чтобы запретить такое злоупотребление?

+0

Не могли бы вы просто сделать его статическим? – fileoffset

+0

Предположительно мне нужно использовать либо новое поле в объекте позиции, либо новую функцию запроса в списке. – user1824518

+0

Подобное поведение похоже на 'std :: list' ([Live demo] (http://coliru.stacked-crooked.com/view?id=a1fe493224aec77d1a91b5e182b0a7bd-7063104e283ed82d51a6fde7370c6e59)) – soon

ответ

2

У Итератора есть указатель на NodeList, которому это принадлежит.

class Iterator {    // an iterator for the list 
public: 
    Elem& operator*();   // reference to the element 
    bool operator==(const Iterator& p) const; // compare positions 
    bool operator!=(const Iterator& p) const; 
    Iterator& operator++();   // move to next position 
    Iterator& operator--();   // move to previous position 
    friend class NodeList;   // give NodeList access 
private: 
    Node* v;     // pointer to the node 
    NodeList* plist; 
    Iterator(Node* u,NodeList* p);   // create from node 

}; 

При создании пути Итератора это как NodeList. Затем в вашем методе вставки проверьте, что ваш Iterator.plist == this

Смежные вопросы