类中的 C++ 迭代器

标签 c++ iterator

我有以下类(class):

 class list {
      private:
        struct node {
          node() { data=T(); prev=next=this; }
          ˜node() {}
          T data;
          node *prev;
          node *next;
        };
      public:
        class iterator {
        public:
          iterator() : p(NULL) {}
          T & operator*() { return p->data; }
          iterator & operator++()
            { p = p->next; return *this; }
          iterator & operator++(int)
            { iterator tmp = *this; ++*this; return *tmp; }
          bool operator==(const iterator & rhs) const
            { return p == rhs.p; }
          bool operator!=(const iterator & rhs) const
            { return p != rhs.p; }
        private:
          friend class list<T>;
          iterator(node *p) : p(p) {}
          node *p;
        };
        iterator begin() { return iterator(head->next); }
        iterator end() { return iterator(head); }
        list();
        ˜list();
        etc ...
      private:
        int N;
        node *head;
        node *findnode(int);
    };

我看到 begin() 函数返回迭代器类的构造函数。这是否意味着在调用时创建了一个新的迭代器?如果是这样,在这个迭代器分配给的变量超出范围后,内存是否会被回收?我有点困惑,因为迭代器构造函数没有返回类型。如果有人能阐明我的问题,我将不胜感激。

最佳答案

是的,在调用 begin 时会创建一个新的迭代器。在高层次上,是的,迭代器占用的内存将在超出范围后被回收。

构造函数没有返回类型,因为它们是在要初始化的内存上调用的。

在较低的层次上,在堆栈上声明的变量在超出范围时会调用其析构函数,这是“回收”的一个方面。它们占用的内存在堆栈上而不是在堆上(如果调用了 new 就会如此),因此在执行删除或垃圾收集时它不会被释放。相反,变量占用的内存可能会闲置一段时间或立即被覆盖,具体取决于堆栈帧是否在超出范围后立即被删除或添加(即函数正在返回堆栈或正在进行新调用) .

关于类中的 C++ 迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13407309/

相关文章:

c++ - 在 C++ 中访问 dgemm

c++ - 如何检查 cin 是否为文件结尾?

c++ - 在结构中初始化字符串数组

c++ - 如何遍历一个boost::multi_array

C++:带有空格的cin到没有getline函数的字符串

c++ - 为什么 getline() 不接受常量 istream?

python - 生成器字典内的迭代变量

java - Java中TreeMap的并发修改

generics - 如何在不使用克隆的情况下编写保持状态并返回值的通用迭代器?

c++ - std::vector::begin() - 1 是否未定义?