公告版位
星落的瞬間!放棄的後悔是永遠!

http://damody.googlecode.com/files/tree_node.7z
就是非常簡單,想說用來放自己的壓縮檔的檔案庫管理。
最近對STL跟template愈來愈熟之後,回去寫VB.NET跟C#有種不順手的感覺qq
5/29修正RemoveAllByName的bug

TreeNode.hpp

#pragma once
#include <cstring>
#include <vector>
#include <string>
#include <ostream>
#include <cassert>

template<typename T>
class TreeNode
{
public:
    typedef TreeNode<T>* TNodePtr;
    typedef TreeNode<T> TNode;
    typedef std::vector<TNode> Container;
    typedef typename std::vector<TNodePtr>::iterator pre_iterator;
    typedef typename Container::iterator iterator;
    T m_data;
    TNodePtr parent;
    std::wstring m_name;
protected:
    Container m_subnode;
    std::vector<TNodePtr> m_PtrSave;
public:
    TreeNode<T>(T data, std::wstring in_name):m_name(in_name),m_data(data)
    {}
    TreeNode<T>(TreeNode<T>* tn_ptr):m_name(tn_ptr->m_name),m_data(tn_ptr->m_data)
    {}
    const Container& GetContainer()
    {
        return m_subnode;
    }
    TreeNode<T>& operator[](size_t index)
    {
        assert(index>=0 && index<m_subnode.size());
        return m_subnode[index];
    }
    void ClearMyself()
    {
        for (iterator it = m_subnode.begin();it!=m_subnode.end();it++)
        {
            it->ClearMyself();
        }
        m_subnode.clear();
    }
    void RemoveOneByName(const std::wstring in_name)
    {
        for (iterator it = m_subnode.begin();it!=m_subnode.end();it++)
        {
            if (in_name == it->m_name)
            {
                it->ClearMyself();
                m_subnode.erase(it);
                break;
            }
        }
    }
    void RemoveAllByName(const std::wstring in_name)
    {
        for (iterator it = m_subnode.begin();it!=m_subnode.end();it++)
        {
            if (in_name == it->m_name)
            {
                it->ClearMyself();
                it = m_subnode.erase(it);
            }
        }
    }
    void RemoveByPtr(TreeNode<T>* in_ptr)
    {
        for (iterator it = m_subnode.begin();it!=m_subnode.end();it++)
        {
            if (in_ptr == &(*it))
            {
                it->ClearMyself();
                m_subnode.erase(it);
                break;
            }
        }
    }
    void RemoveByRef(TreeNode<T>& in_ptr)
    {
        for (iterator it = m_subnode.begin();it!=m_subnode.end();it++)
        {
            if (&in_ptr == &*it)
            {
                it->ClearMyself();
                m_subnode.erase(it);
                break;
            }
        }
    }
    bool empty()
    {
        return m_subnode.empty();
    }
    void AddData(T in_data, const std::wstring& name)
    {
        m_subnode.push_back(TreeNode(in_data, name));
    }
    void AddNode(TreeNode<T>* in_node)
    {
        m_subnode.push_back(TreeNode(in_node));
    }
    iterator begin()
    {
        return m_subnode.begin();
    }
    iterator end()
    {
        return m_subnode.end();
    }
    pre_iterator pre_begin()
    {
        m_PtrSave.clear();
        for (iterator it = m_subnode.begin();it!=m_subnode.end();it++)
        {
            m_PtrSave.push_back(&(*it));
            traverse(it);
        }
        return m_PtrSave.begin();
    }
    void traverse(iterator in_it)
    {
        for (iterator it = in_it->m_subnode.begin();it!=in_it->m_subnode.end();it++)
        {
            m_PtrSave.push_back(&(*it));
            traverse(it);
        }
    }
    pre_iterator pre_end()
    {
        return m_PtrSave.end();
    }
    iterator find(const std::wstring& in_name)
    {
        for (iterator it = m_subnode.begin();it!=m_subnode.end();it++)
        {
            if (in_name == it->m_name)
                return it;
        }
        return it;
    }
    friend std::wostream& operator<< (std::wostream& os, TreeNode<T>& tn)
    {
        os << tn.m_name.c_str();
        return os;
    }
};



創作者介紹

!壞人必需做好事!

讓地獄深紅的天亮 發表在 痞客邦 PIXNET 留言(1) 人氣()


留言列表 (1)

發表留言
  • novus
  • 你大概沒聽過 VB6 底下的大絕 listbox sort

    以前要是有人膽敢在VB討論區發問:「老師要我們寫n個數字比大小的程式」
    大概會被這樣打發掉:
    建立一個 invisible 的listbox control,把你要 sort 的東西加到listbox中,然後呼叫 listbox.sort

    為什麼要說這個呢?因為VB6裡面有 treeview control
    加一些條件就可以造出bst rb-tree、n-ary tree 等等

    很爛嗎? who cares
  • 恩,真的沒聽過沒體驗過過= =
    以前天天用vb6時也是自己寫排序的。
    用vb6的寫treeview control寫rb-tree好像很有教學意義耶!
    因為很像很方便看到的樣子XD

    讓地獄深紅的天亮 於 2010/05/29 12:10 回覆

找更多相關文章與討論