我目前正在尝试编写树数据结构。在尝试为我的原始数据结构创建迭代器,然后了解 STL 规范之后,我走上了这条路。
我将尝试稍微压缩我的代码,但仍然会展示我对代码未编译的困惑。如果缺少某些内容,我会很乐意稍后添加。
// Relevant bits of tree.hpp
template <class T, class Alloc = std::allocator<T> >
class tree
{
public:
struct NODE
{
T data;
std::vector<NODE*> children;
NODE* parent;
NODE* right;
// Not shown here: size()
};
typedef Alloc allocator_type;
typedef typename Alloc::value_type value_type;
typedef value_type& reference;
typedef const value_type& const_reference;
typedef typename Alloc::difference_type difference_type;
typedef typename Alloc::size_type size_type;
class iterator
{
public:
typedef typename Alloc::difference_type difference_type;
typedef typename Alloc::value_type value_type;
typedef typename Alloc::reference reference;
typedef typename Alloc::pointer pointer;
typedef std::forward_iterator_tag iterator_category;
iterator(NODE* node) : currentNode_(node) {}
iterator(const iterator& i) : currentNode_(i.currentNode_) {}
iterator& operator++ ();
// Not shown here: operator==, operator!=, operator*, operator->
private:
NODE* currentNode_;
};
// Not shown here: constructors, begin(), end(), size(), empty(), etc...
private:
NODE root_;
};
// Relevant bits of tree.cpp
template <class T, class Alloc>
typename tree<T, Alloc>::iterator&
tree<T, Alloc>::iterator::operator++ ()
{
if (!currentNode_->children.empty())
currentNode_ = currentNode_->children.front();
else if (currentNode_->right != nullptr)
currentNode_ = currentNode_->right;
else {
while (currentNode_->parent->right == nullptr)
currentNode_ = currentNode_->parent;
currentNode_ = currentNode_->parent->right;
}
currentNode_ = "abc - Just some random string, definitely not a NODE*";
return *this;
}
为什么我可以分配看似随机的东西currentNode_
?此外,即使我返回的东西显然不是 a iterator&
,或者甚至只是将 return 语句全部省略,代码仍然可以愉快地编译。到底是怎么回事?
我还没有测试当我实际调用代码时会发生什么,因为我还没有实现实际代码来填充树。在继续之前,我想确保我掌握了这些基础知识。
Ninja 编辑:要编译,我调用find src/ -name "*.cpp" | xargs g++ -Isrc/ -O3 -Wall -Wextra -pedantic -std=gnu++0x || exit 1
.