C++ 中的堆栈迭代器
Stack Iterator in C++
我想了解迭代器是什么,它们是如何制作的。因此,此代码迭代器是为 Stack.My 创建的,问题是
- 如果我们没有 class 具有显式构造函数的命名 Stack,我们如何编写 Stack s2(s1),而是我们有 StackIter class,它具有显式构造函数?
- 什么意思:
StackIter *Stack::createIterator()const
,我们有class StackIter,然后是栈上的指针,完全不懂。可能我们写Stacks2(s1)
的时候是从这里来的?
- 所以迭代器的含义如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" 或一些类似的书籍,它们可以让您全面了解如何使用迭代器并解决所有先决条件。
我想了解迭代器是什么,它们是如何制作的。因此,此代码迭代器是为 Stack.My 创建的,问题是
- 如果我们没有 class 具有显式构造函数的命名 Stack,我们如何编写 Stack s2(s1),而是我们有 StackIter class,它具有显式构造函数?
- 什么意思:
StackIter *Stack::createIterator()const
,我们有class StackIter,然后是栈上的指针,完全不懂。可能我们写Stacks2(s1)
的时候是从这里来的? - 所以迭代器的含义如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" 或一些类似的书籍,它们可以让您全面了解如何使用迭代器并解决所有先决条件。