尝试使用STL容器

时间:2018-12-03 02:07:47

标签: stl iterator containers c++17

我正在尝试使用链接列表制作std :: set版本。我想我基本上正确地实现了它,但是却遇到了无法解释的编译错误。我会很感激任何人在我的代码中发现错误,或者解释我将如何追踪这样的错误。这意味着错误会影响到stl函数。

#include <iterator>
#include <cstddef>
template <typename Type>
struct ListNode{
        Type info;
        ListNode<Type> * next;
        ListNode(Type newInfo, ListNode<Type> * newNext) : info(newInfo), next(newNext){
            }
        ListNode(ListNode<Type>& L): info(L.info), next(L.next){
        }
        ListNode<Type>& operator=(ListNode<Type>& L){
            info = L->info;
            next = L->next;
            return this;
        }
        };
template <typename Type>
class SetList{
    ListNode<Type> * head;
    ListNode<Type> * tail;
       public:
        typedef ListNode<Type> value_type;
        SetList() : head(nullptr), tail(nullptr){
        }
        SetList(SetList & s){

        }
        ~SetList(){
            //ListNode<Type> * cur = head;
            //ListNode<Type> * next = cur;
            //while(cur){
        //      next = cur->next;
        //      delete cur;
        //      cur = next;
          //  }
        }


        struct iterator{
            //traits
            typedef std::forward_iterator_tag iterator_category;
            typedef iterator self_type;
            typedef Type value_type;
            typedef Type& reference;
            typedef Type* pointer;
            typedef ptrdiff_t difference_type;
            private:
                //rename to ihead
                ListNode<Type>* ibuf;
            public:
                iterator(ListNode<value_type>* node) : ibuf(node){}
                self_type& operator++(){ibuf = ibuf->next; return *this;}
                self_type operator++(int postfix){
                   self_type cpy = *this;
                   ibuf = ibuf->next;
                   return cpy;
                }
                reference operator*(){return ibuf->info;}
                pointer operator->(){return &ibuf->info;}
                self_type operator=(const iterator& it){insert(*it);}
  bool operator==(const self_type& rhs) const {return ibuf->info == rhs.ibuf->info;}
                bool operator !=(const self_type& rhs) const {return ibuf->info != rhs.ibuf->info;}
        };

        iterator begin(){ return iterator(head);}
        iterator end() { return iterator(nullptr);}
//      const_iterator begin() { return const_iterator(head);}
//      const_iterator end() { return const_iterator(tail);}
        Type operator[](int index){
            iterator cur(head);
            for(int i = 0; i < index; ++i,++cur){
            }
            return *cur;
        }
        SetList<Type>& operator=(const SetList<Type>& s){
            head = s.head;
            tail = s.tail;
            return this;
        }
        iterator find(Type toFind){
            ListNode<Type> * cur = head;
            while(cur){
                if(cur->info == toFind)
                    return iterator(cur);
            }
            return this->end();
        }
        void insert(Type toInsert){
            ListNode<Type>* cur = nullptr;
            if(head){
                cur = new ListNode<Type>(toInsert, head);
                head = cur;
            }else{
                cur = new ListNode<Type>(toInsert, nullptr);
                head = cur;
            }

        }
};

我在我的设备上的其他地方调用副本,我的副本调用使用std :: set但不适用于我的设备。 我得到的错误如下。 error

希望这不是很多问题。您甚至不必阅读我的代码,甚至只需输入有关如何跟踪此类大错误的信息,就将不胜感激。

1 个答案:

答案 0 :(得分:0)

SetList<Type>应该以{{1​​}}作为Type,而不是value_type