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;
}
};
留言列表