C++ 中的堆栈迭代器

Stack Iterator in C++

我想了解迭代器是什么,它们是如何制作的。因此,此代码迭代器是为 Stack.My 创建的,问题是

  1. 如果我们没有 class 具有显式构造函数的命名 Stack,我们如何编写 Stack s2(s1),而是我们有 StackIter class,它具有显式构造函数?
  2. 什么意思:StackIter *Stack::createIterator()const,我们有class StackIter,然后是栈上的指针,完全不懂。可能我们写Stacks2(s1)的时候是从这里来的?
  3. 所以迭代器的含义如bool operator == (const Stack &l, const Stack &r) ?

非常感谢。 任何回应将不胜感激

#include <iostream>
using namespace std;
class Stack
{
    int items[10];
    int sp;
  public:
    friend class StackIter;
    Stack()
    {
        sp =  - 1;
    }
    void push(int in)
    {
        items[++sp] = in;
    }
    int pop()
    {
        return items[sp--];
    }
    bool isEmpty()
    {
        return (sp ==  - 1);
    }
    StackIter *createIterator()const; // 2. Add a createIterator() member
};

class StackIter
{
    // 1. Design an "iterator" class
    const Stack *stk;
    int index;
  public:
    StackIter(const Stack *s)
    {
        stk = s;
    }
   void first()
    {
        index = 0;
    }
    void next()
    {
        index++;
    }
    bool isDone()
    {
        return index == stk->sp + 1;
    }
    int currentItem()
    {
        return stk->items[index];
    }
};

StackIter *Stack::createIterator()const
{
  return new StackIter(this);
}

bool operator == (const Stack &l, const Stack &r)
{
  // 3. Clients ask the container object to create an iterator object
  StackIter *itl = l.createIterator();
  StackIter *itr = r.createIterator();
  // 4. Clients use the first(), isDone(), next(), and currentItem() protocol
  for (itl->first(), itr->first(); !itl->isDone(); itl->next(), itr->next())
    if (itl->currentItem() != itr->currentItem())
      break;
  bool ans = itl->isDone() && itr->isDone();
  delete itl;
  delete itr;
  return ans;
}

int main()
{
  Stack s1;
  for (int i = 1; i < 5; i++)
    s1.push(i);
  Stack s2(s1), s3(s1), s4(s1), s5(s1);
  s3.pop();
  s5.pop();
  s4.push(2);
  s5.push(9);
  cout << "1 == 2 is " << (s1 == s2) << endl;
  cout << "1 == 3 is " << (s1 == s3) << endl;
  cout << "1 == 4 is " << (s1 == s4) << endl;
  cout << "1 == 5 is " << (s1 == s5) << endl;
}

1)默认拷贝构造函数运算符:

Stack s2(s1) 对应于 Stack s2(const Stack& x) 复制构造函数,如果你不告诉他使用另一个,则由你的编译器生成。

2)成员函数的定义

StackIter *Stack::createIterator()const { ...}是你class中声明的成员函数createIterator()的定义,但还没有定义。基本上它 returns 一个指向 StackIter 的指针。

3) 运算符的定义

不确定你的问题。

bool operator == (const Stack &l, const Stack &r) 定义两个堆栈之间的比较。所以先验与迭代器没有直接关系。

但实际上,这个函数演示了迭代器的使用。

P.S:我认为您正在处理 this tutorial 的示例。但是,我强烈建议您阅读 "The C++ Programming Language" 或一些类似的书籍,它们可以让您全面了解如何使用迭代器并解决所有先决条件。