Пожалуйста, будьте милы - это мой первый вопрос.= P
В основном, как летний проект, я просматривал список структур данных на странице википедии и пытался реализовать их.Я взял курс C ++ в прошлом семестре и нашел, что это было очень весело, в качестве финального проекта я реализовал Binomial Heap - это было также очень весело.Может быть, я идиот, но мне нравятся структуры данных.
В любом случае, достаточно предыстории.Проект идет хорошо, я начинаю с Binary Trees.Чтобы пойти гораздо дальше, мне нужно создать итераторы для обхода деревьев.Я уже решил, что создам два типа итераторов для каждого метода обхода (обычный итератор и константный итератор), я просто не знаю, как это сделать.Я слышал о наследовании от итераторов stl, или даже об использовании бустеров iterator_facade (что кажется хорошим вариантом)
Я даже не пытался написать код итератора, так как не знаю, с чего начать,но у меня есть текущий код на GitHub.Вы можете проверить это здесь .
В случае, если вы против github, я вставляю соответствующие определения классов.Реализации этих функций на самом деле не помогут, но если они вам понадобятся по какой-то причине, дайте мне знать.Кроме того, класс узла имеет родительский указатель для итерационных целей.
#ifndef __TREES_HXX
#define __TREES_HXX
#include <cstdlib> // For NULL
#include <algorithm> // for std::max
// Node class definition. These nodes are to be used for any
// tree where the structure is
// node
// /\
// left right
// /\ /\
//
// etc., basically two children.
template <typename T>
class Node
{
public:
T data_;
Node<T>* left_;
Node<T>* right_;
Node<T>* parent_; // Needed for iterators
explicit Node(T const&);
Node(Node<T> const&);
};
template <typename T>
class BinaryTree
{
protected:
typedef Node<T>* node_t;
size_t tree_size;
public:
typedef T value_type;
explicit BinaryTree();
explicit BinaryTree(T const&);
~BinaryTree();
virtual node_t insert(node_t&, T) = 0;
virtual T& lookup(node_t const&, T const&) const = 0;
inline virtual size_t size() const;
inline virtual size_t depth(node_t const&) const;
inline bool empty() const;
inline void clear(node_t);
node_t root;
};
Это базовое расширение двоичного дерева нашего абстрактного класса, в основном это (будет) BST.Для примера, почему мне нужны итераторы, посмотрите на определение функции поиска.Он должен возвращать итератор к узлу, где найден материал.
/* Implementation of our Binary Tree is in
* this file. The node class is in Trees.hxx
* because it's intended to be a general class.
*/
#ifndef __BINARY_TREE_HXX
#define __BINARY_TREE_HXX
#include "Trees.hxx"
template <typename T>
class BiTree : public BinaryTree<T>
{
private:
typedef typename BinaryTree<T>::node_t node_t;
public:
typedef typename BinaryTree<T>::value_type value_type;
BiTree() : BinaryTree<T>()
{
}
BiTree(T const& data) : BinaryTree<T>(data)
{
}
node_t insert(node_t&, T);
T& lookup(node_t const&, T const&) const; // Note: This should return an iterator to the node where the stuff is found
};
Я думаю, это все - спасибо за ваше время!Если вам нужна дополнительная информация, дайте мне знать.