C++11 智能指針unique_ptr使用 -- 以排序二叉樹爲例

    用智能指針能夠簡化內存管理。以樹爲例,若是用普通指針,一般是在插入新節點時用new,在析構函數中調用delete;但有了unique_ptr類型的智能指針,就不須要在析構函數中delete了,由於當unique_ptr類型的指針P生命結束時(好比對於局部變量,程序執行到局部變量的做用域範圍以外),P會自動delete它擁有的資源(指針指向的空間)。對於shared_ptr,狀況更加複雜一些,shared_ptr會維護一個use count,即有多少個指針共享這一資源,當use count爲0時,資源被自動釋放。ios

    有一篇wiki專門解釋了這種模式(將資源的獲取與釋放與對象的生命週期綁定),http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initializationapp

    這篇文章主要關注unique_ptr,若是不熟悉,能夠先讀一下這個:http://www.cplusplus.com/reference/memory/unique_ptr/函數

    這裏用排序二叉樹的簡單實現來展現如何使用unique_ptr,咱們只實現插入一個int,以及中序遍歷輸出全部數字的功能,這已經足以解釋unique_ptr的使用方法(實際上是,我不太會寫二叉樹的平衡- -)ui

    TreeNode表明一個樹節點,包括一個int值,和指向左右子樹的智能指針。咱們在TreeNode和BST裏都實現了insert(int)和inOrder(),BST中的方法基本上是調用TreeNode的對應方法(BST的方法只是一個wrapper,真正幹活的是TreeNode裏的對應方法)spa

#include <cstdio>
#include <iostream>
#include <sstream>
#include <string>
#include <memory>
using namespace std;
class TreeNode{
    public:
    unique_ptr<TreeNode> left;
    unique_ptr<TreeNode> right;
    int val;
    TreeNode(){}
    TreeNode(int value): val(value){}
    void insert(int value){
        if (value <= val) {
            if (left) {
                left->insert(value);
            } else {
                left.reset(new TreeNode(value));
            }
        } else {
            if (right) {
                right->insert(value);
            } else {
                right.reset(new TreeNode(value));
            }
        }
    }
    void inOrder(stringstream& ss){
        if (left){
            left->inOrder(ss);
        }
        ss << val << " ";
        if (right) {
            right->inOrder(ss);
        }
    }
};
class BST {
public:
    BST ();
    virtual ~BST ();
    void insert(int value);
    string inOrder();
private:
    unique_ptr<TreeNode> root;
};
BST::BST(){}
BST::~BST(){}
void BST::insert(int value){
    if(root){
        root->insert(value);
    } else {
        root.reset(new TreeNode(value));
    }
}
string BST::inOrder(){
    if (root) {
        stringstream ss;
        root->inOrder(ss);
        return ss.str();
    } else {
        return "";
    }

}
int main(int argc, const char *argv[])
{
    BST bst;
    bst.insert(4);
    bst.insert(5);
    bst.insert(2);
    bst.insert(1);
    cout << bst.inOrder() << endl;
    return 0;
}

     有人提到可能要把TreeNode指定爲NonCopyable,見http://stackoverflow.com/questions/6679482/smart-pointers-for-modelling-a-general-tree-structure-its-iterators,挺有道理的,這個實現不算複雜,能夠參考http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Non-copyable_Mixin指針

相關文章
相關標籤/搜索