C++ C++;typename嵌套类模板
我在二叉树上迭代时遇到了以下模板类,它有一个用于迭代器的内部类模板:C++ C++;typename嵌套类模板,c++,class,templates,iterator,typename,C++,Class,Templates,Iterator,Typename,我在二叉树上迭代时遇到了以下模板类,它有一个用于迭代器的内部类模板: template <typename T> struct BinaryTree { Node<T>* root = nullptr; explicit BinaryTree(Node<T>* const root) : root{ root }, pre_order{ *this } { root->set_tree(this); } ~Bina
template <typename T> struct BinaryTree
{
Node<T>* root = nullptr;
explicit BinaryTree(Node<T>* const root)
: root{ root }, pre_order{ *this }
{
root->set_tree(this);
}
~BinaryTree() { if (root) delete root; }
template <typename U>
struct PreOrderIterator
{
Node<U>* current;
explicit PreOrderIterator(Node<U>* current)
: current(current)
{
}
bool operator!=(const PreOrderIterator<U>& other)
{
return current != other.current;
}
// no continuations in C++ (unlike C#)
PreOrderIterator<U>& operator++()
{
if (current->right)
{
current = current->right;
while (current->left)
current = current->left;
}
else
{
Node<T>* p = current->parent;
while (p && current == p->right)
{
current = p;
p = p->parent;
}
current = p;
}
return *this;
}
Node<U>& operator*() { return *current; }
};
typedef PreOrderIterator<T> iterator;
iterator end()
{
return iterator{ nullptr };
}
iterator begin()
{
Node<T>* n = root;
if (n)
while (n->left)
n = n->left;
return iterator{ n };
}
};
模板结构二进制树
{
Node*root=nullptr;
显式二进制树(节点*常量根)
:root{root},前顺序{*this}
{
根->设置树(此);
}
~BinaryTree(){if(root)delete root;}
模板
结构预排序器
{
节点*电流;
显式预排序器(节点*当前)
:当前(当前)
{
}
布尔运算符!=(常量预排序器和其他)
{
返回电流!=other.current;
}
//在C++中没有连续性(不像C ^)
预排序器和运算符++()
{
如果(当前->右侧)
{
当前=当前->右侧;
while(当前->左)
当前=当前->左侧;
}
其他的
{
节点*p=当前->父节点;
while(p&¤t==p->right)
{
电流=p;
p=p->parent;
}
电流=p;
}
归还*这个;
}
节点和运算符*(){return*current;}
};
typedef预排序迭代器;
迭代器结束()
{
返回迭代器{nullptr};
}
迭代器begin()
{
节点*n=根;
如果(n)
同时(n->左)
n=n->左;
返回迭代器{n};
}
};
但是我不明白为什么为迭代器创建一个额外的内部类模板是有益的:迭代器的类型名不总是t吗,这使得额外的模板是多余的
这种方法是否有我没有的优势?这是一些可疑的代码。当您从PreOrderWriter中删除模板时发生了什么?我同意:
PreOrderWriter
根本没有明显的理由成为成员模板。@Eljay当我删除模板时,它仍然以完全相同的方式运行。这是一些可疑的代码。当您从PreOrderWriter中删除模板时发生了什么?我同意:PreOrderWriter
完全没有明显的理由成为成员模板。@Eljay当我删除模板时,它仍然以完全相同的方式运行。