auto_ptrからunique_ptrへの移行は非常に簡単である.
以下の例はauto_ptrの代わりにunique_ptrを使用して簡単なツリーをインオーダ順で走査するコード.
tree.h
#ifndef __TREEPRJ_TREE_H__ #define __TREEPRJ_TREE_H__ #include <string> #include <memory> #include <iostream> class Node { public: Node(int idVal, std::string nameVal) :id(idVal), name(nameVal){} virtual ~Node() { std::cout << "ID[" << id << "] is being released" << std::endl; } int id; std::string name; std::unique_ptr<Node> l; std::unique_ptr<Node> r; }; class Tree { private: std::unique_ptr<Node> root; void _add(std::unique_ptr<Node>& n, int id, std::string name); void _traverseInorder(std::unique_ptr<Node>& n); public: Tree(int id, const std::string n); virtual ~Tree() {} void add(int id, std::string name); void traverseInorder(); }; #endif
tree.cpp
#include "tree.h" #include <iostream> Tree::Tree(int id, const std::string name) { root.reset(new Node(id, name)); } void Tree::add(int id, std::string name) { _add(root, id, name); } void Tree::_add(std::unique_ptr<Node>& n, int newId, std::string newName) { if ( !n ) return; if (n->id > newId) { if (n->l) { _add(n->l, newId, newName); } else { n->l.reset(new Node(newId, newName)); } } else { if (n->r) { _add(n->r, newId, newName); } else { n->r.reset(new Node(newId, newName)); } } } void Tree::traverseInorder() { _traverseInorder(root); } void Tree::_traverseInorder(std::unique_ptr<Node>& n) { if (!n) return; _traverseInorder(n->l); std::cout << "ID:" << n->id << ",NAME:" << n->name << std::endl; _traverseInorder(n->r); } int main() { Tree t(30, "The Colton"); t.add(25, "The Warwick"); t.add(21, "Hawthorne Court"); t.add(45, "Hampton Court Garden"); t.add(15, "The Belvedere"); t.add(50, "Stratford Hall"); t.traverseInorder(); }
0 件のコメント:
コメントを投稿