图模板(一)——基本操作
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://redwolf.blog.51cto.com/427621/88183 |
最近比较清闲,看了点关于模板的书,顺便写了点数据结构。有兴趣的朋友可以一起测试一下,并热烈欢迎朋友们一起讨论,斧正。
注:1、这个文件中包含两种结构的图,都是基于邻接表的。测试数据相同,所得结果相同。
2、图比较复杂,分几个部分发吧(其实是没有写完
3、编译/测试环境:vs2005+boost
本图的数据结构与通常数据结构书籍上介绍的并没有多少不同,如果不太理解,可以参考一下相关的书籍或者文章,都进行了详细的介绍(提供一个地址,在线数据结构:http://student.zjzk.cn/course_ware/data_structure/web/tu/tu7.3.1.2.htm)。唯一的一点就是通常书籍上对于边节点的存储是顶点节点在容器(数组)中的索引序号,而本图是通过共享型指针存储的,即顶点节点和边节点指向相同的Vertex结构值。
另外由于是基于模板的,所以把结构细化了一下,并单独抽取了关键字作为一个模板参数。基本结构如下:
顶点(点结构):
template<typename V, typename K>
class vertex
{
public:
……
private:
V data;
K key;
};
边节点:
template<typaname V, typename K, typename W>
arc_node
{
public:
typedef boost::shared_ptr<VERTEX> VPTR;
typedef arc_node<V,K,W> ARCNODE; ……
private:
VPTR _head;//弧头指针
W weight;//权值 }; 顶点节点:
template<typaname V, typename K, typename W>
vertex_node
{
public:
typedef typename arc_node<V,K,W>::VPTR VPTR;
typedef std::list<ARCNODE> ARCLIST; ……
private:
VPTR _tail;//狐尾(顶点)指针
ARCLIST arcslist;//出边节点列表 friend class graph<V,K,W>;//可直接访问vertex_node的私有成员
};
图结构:
template<typaname V, typename K, typename W>
graph
{
public:
typedef std::vector<VERTEXNODE> VERTEXVECTOR;
……
private:
VERTEXVECTOR vertex_vector;
}; 图由一个装载顶点节点的容器vector构成;
顶点节点有一个vertex结构的共享型指针(shared_ptr)和一个出边节点列表(list)。
边节点有一个vertex结构的共享型指针(shared_ptr)和一个权值W
vertex结构,一个简单的数据结构,包含V和K。
这里应用了boost的shared_ptr简化了内存操作的很多复杂内容。关于boost的shared_ptr,大家可以参考一些资料。我这里也转贴一个,希望对大家有一些帮助。
====================================================================== template<typename V, typename K, typename W> class graph; template<typename V, typename K, typename W> class vertex_node; template<typename V, typename K> class vertex//顶点 { public: //简化类型名称长度 typedef vertex<V,K> VERTEX; //构造 vertex(const V& v=V(), const K& k=K()):data(v), key(k){} //拷贝构造 vertex(const VERTEX& other):data(other.data), key(other.key){} //析构 virtual ~vertex(){} //重载=(由于没有指针成员,所以也可以不用重载) VERTEX& operator=(const VERTEX& rhs){ if(&rhs!=this){ this->destroy(); this->data=rhs.data; this->key=rhs.key; } return *this; } //获取key inline K get_key()const{ return key; } //获取顶点的数据 inline V get_data()const{ return data; } //设置key值 inline void set_key(const K& k){ key=k; } //设置顶点数据 inline void set_data(const V& v){ data=v; } protected: void destroy(){} private: V data; K key; };======================================================================
。。。。。。
。。。。
。。
。
本文出自 “狼窝” 博客,请务必保留此出处http://redwolf.blog.51cto.com/427621/88183 本文出自 51CTO.COM技术博客 |
附件下载:
graph.h
graph.h


template<typename V, typename K, typename W> class graph;
redwolf_79
博客统计信息
热门文章
最新评论
友情链接