请按任意键继续...

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  21 随笔 :: 0 文章 :: 2 评论 :: 0 Trackbacks

#

  检查在“stdafx.h”声明或定义的函数或类后面是否加了“;”
 
  对下面的函数定义,vs08会报错
  void MaxHeap(vector<int> &ivc, size_t heapSz = ivc.size())
  {……}
  原因是从左至右检查形参
posted @ 2012-11-23 08:29 星哥 阅读(2719) | 评论 (0)编辑 收藏

   下午在学习Bruno的数据结构那本书的散列函数时,碰到了一个神奇的数:
       2654436769
   因为这个数得到了很分散的散列值,不得不感叹数学的妙趣。
附代码段:
    const unsigned int k = 8 * sizeof(unsigned int),
                                 m = 10, a = 2654435769;
   for(unsigned int ui = 1000; ui <= 10001; ++ui)
         {
               std::cout << (ui * a  << ( k - m) ) << " ";
               if((ui - 1000 + 1 ) % 10 == 0)
                       std::cout << std::endl;
         }
    如果想会用计算机解决问题,要把数学当作一门基本功夫。就像要练少林十八
绝技,得先扎好马步。
posted @ 2012-11-22 17:03 星哥 阅读(212) | 评论 (0)编辑 收藏

   今晚写个了判断一个数的集合是否是最大堆函数时,在使用宏时碰到了一个小启示:
    #define R(i) (i << 1 + 1)
   上面宏定义本意是求i的右孩子下标的,可是当i = 3时,R(i)却是12.
   困顿了一两分钟,大悟,改为:
    #define R(i) ((i << 1) +1)
   原因是<<的优先级低于+。本来编译器有warning的,但自信那是无关重要的警告。
所以吃了个小亏。
posted @ 2012-11-21 22:19 星哥 阅读(132) | 评论 (0)编辑 收藏

    今晚用vector<int>::iterator写了合并排序算法,受尽“折磨”。在实现merge(vecotor<int>::iterator, vector<int>::iterator, vector<int>::iterator)时,我传入了待排序vector<int>对象的三个迭代器,然而在函数里面又需要再定义一个vector<int>类型的局部对象。在数组下标“概念”的影响下,我自然地将比较个对象的迭代器,因为使用数组时我们是这样做。但是,出现恐怖的“警告框”,意味着要从库文件的代码中查找错误。不过,在经验的指导下和框中间的一行断言,我们可以大概推断出错误所在。可能太依赖vs2008中断点跟踪功能。我不可思索地插入断点,没在意那一句重要的“断言”。因为对迭代器的实现理解不足,在跟踪过程中,监视迭代器对象时出现不能接受的值,如end()的结果竟会是个绝对值很大的负数,对它进行解引用时临时提示“不能识别操作”……以前在用数组时从未出现的现象发生了,而我去依赖于vs,没有考虑代码,跟踪过程中,脑海没有联想过代码,似乎在做机械的按“F5, shift+F5, F10, F11”操作。快想放弃,留着以后来解决的时,我一不小心,进入merge函数,然后又恰巧地跟踪迭代器比较的那行代码中跳出我警告框。这时恍然大悟了。
   有以下教训:
   1,不能用数组类似地对待vector<int>,两者的区别不仅仅是前者没有成员函数而后者有。它们是没有半血缘关系的陌生人。
   2, 迭代器的某此操作有点像下标,但不能与下标归入同一路货色。接下来看了《深度探索C++对象模型》可能会理解得更好。
   3,调试先问自己要断点设哪,要监视哪些变量,监视的变量的值应该是多少,哪一行的代码会导致错误
   4,只会插入断点和F10、F11是没办法成为一流程序员的。如果可以根据运行结果直接思考出debug在哪发生并修改正确的话,那是最好,
        也是应该的吧,因为自己写的代码,自己肯定很熟,哪里有毛病会很快探测出来。
   5, 脑子跟着CPU跑代码,这是必须的,也是重要的。如果编程功力也像武侠小说里面说的有第几层境界说法的话,那能跑越多行代码,
        说明境界越高,特别是在递归函数。
  吸取教训,继续思考着前进,在编程的道路上走得更远。
posted @ 2012-11-03 22:58 星哥 阅读(311) | 评论 (0)编辑 收藏

今晚用模板函数实现了插入排序算法
template<typename T>
void InsertSort(vector<T> & vecT)
{
   typename vector<T>::iterator it1, it2, it1Tmp;
    it1 = vecT.begin() + 1;
    while(it1 != vecT.begin())
    {
         T key = *it1;
          it1Tmp = it1;
          it2 = it1 - 1;
          while(it2 >= vecT.begin() && key < *it2)
           {
                  *it1Tmp = *it1;
                  it1--;
                  it2--;
           }
            *it1Tmp = key;
    }
}
posted @ 2012-10-29 23:01 星哥 阅读(258) | 评论 (2)编辑 收藏

桃花庵--程序员版
写字楼里写字间,写字间中程序员;
程序人员写程序,又将程序换酒钱;
酒醒只在屏前坐,酒醉还来屏下眠;
酒醉酒醒日复日,屏前屏下年复年;
但愿老死电脑间,不愿鞠躬老板前;
奔驰宝马贵者趣,公交自行程序员;
别人笑我太疯癫,我笑自己命太贱;
但见满街漂亮妹,哪个归得程序员?
能做自己喜爱事,何必在意那么多。
posted @ 2012-10-27 19:07 星哥 阅读(144) | 评论 (0)编辑 收藏

1, 在表示依赖关系中可考虑用图

2, 选择图的类型(邻接链表或邻接矩阵):typedef adjacency_list<lists, vecS, directedS>FileDepGraph

3, edg_iterator 构造图:

4, External Property 用于在描述与图对象无关的性质

5, Adjacency_vertice(s, g):返回一对adjacency_iterator,包括s邻点范围

6, Internal propertyproper<Tag, T> 类型来表示,前一个参数说明性质种类,后一个指的是这种性质对象的类型。如property<verte_name_t, std::string>.BGL预定义了许多Tag自定义Tag类型.namespace boost{ enum vertex_compile_cost_t(…); BOOST_INSTALL_PROPERTY(vertex, compile_cost);

posted @ 2012-10-27 07:58 星哥 阅读(187) | 评论 (0)编辑 收藏

因为这一章的内容在《泛型编程与STL》一书中学过,所以看得有点快。

1, 泛型编程是通过定义语用来分离数据结构和算法关系的一种编程方法论, 是构造BGL的基础。这种方法是ADTs的延深

2, 语用可以用虚基类的虚函数实现,多态性是C++的基础

3, 在面向对象编程中,多态性用子类型修饰且用虚基类和继承实现;泛型编程中, 多态性用参数化来修饰且用类模板或函数模板实现

4, 模板函数调用比虚函数调用要快

5, 逆变性子类型规则:继承类的虚函数参数类型必须和它在基类参数的类型一样,或是基类

6, 使用dynamic_cast 会引起运行时异常

7, Std::cout <<Std::boolalpha << std::boolval  能输出“falseor “true”

8, 用模板实现BGL可以避免函数二义性问题

9, 泛型解决问题的步骤:确定有效的算法—>一般化算法—>定义最小量的能让算法运行的语用—>基于语用构建一个框架

10,              在泛型编程的术语中,BGL发明了一个新的术语:conept check,并在<boost/concept_check.hpp>中实现,以便于排查泛型编程引起的错误。

11,              BCCL提供了一个“范型”类类型(<boost/concept_archetype.hpp>),实现concept covering 术语

12,              BGL里的名字限制在名字空间boost

13,              图类型的函数与算法的函数不同,前者可重载,后者是在boost 中的模板函数

14,              为了保持更好灵活性,许多BGL算法中有很长参数表,但常用 的不多,所以提供了许多默认参数。默认形参的调用规则,在使用时有很大的限制,所以BGL提供了一种Named Function Parameters, ebgl_named_params类实现

posted @ 2012-10-26 20:12 星哥 阅读(271) | 评论 (0)编辑 收藏

1, 泛型接口:语法、语用、时空间复杂度, 而不仅是一个函数

2, 分别用vertex edge descriptor 处理 点和边, 且可被graph_traits 类访问, 仅定义了最基本的类操作

3, Source(e, g) target(e, g)分别 veretx_descriptor 类型的源和终点

4, 图模型可以解决很多现实问题是因为点和边可以表示很多对象和性质(property),用property map 概念来描述, 类似于STLmap,key value.有三个函数:get(p_map, key), put(p_map, k, v), p_map[k],

5, 图的抽象结构主要由集合vertices ,edges(相对于图) out_edges,   in_edges, adjacent vertices(相对于点)组成。对应五个集合有五种迭代器:vertex iterator(解引用为vertex descriptor), edge iterator(edge descriptor),  out-edge iterator, in-edge iterator, adjacent iterator.这些迭代器和descriptor 一样可被graph_traits<Graph> 访问。

6, Std::pair<iter, iter>接受一对迭代器,如stl分别表示上边五个集合的范围。Vertices(g) 返回边的范围。使用在boost/tuple/tuple.hpp定义的tiefirst, last= edges(g)可绑定范围.类似的,out_edge(s, g), in_edge(t, g), adjacent_verties(s, g) 可返回相应集合范围的一对iterator

7, Add_vertex(g):返回verex_descriptor, add_edge(vS, vT, g):返回pair<edge_descriptor, bool>

8, Algorithm visitor: 类似于Stl algorithm 中使用的函数对象,提供定制算法的可能,但有多个函数对象(multiple funtor,是通过event points实现的

9, Graph type 有两种:graph classes(用内存来存放图) graph adaptors(用其它类型的行为来创建图的接口)

10,    图类类型有基本的两种:adjacency_matrix(用于稠密图) adjacency_list(主要的,存储点集合,点结构里有出边对象集合, 模板参数有:EdgeList, VertexList, Directed, VertexProperties, EdgePropertiesGraphProperties), 点和边的类型影响图的增删操作。

11,  图适配器类型有revese_graph, filtered_graph

12, 和STL一样,BGL的算法也是泛型实现

posted @ 2012-10-26 14:23 星哥 阅读(304) | 评论 (0)编辑 收藏

    前天晚上接受一个任务,说是使用boost 里面的图形库来改写一篇关于时态析取论文的代码。虽然一直想学boost库,但总停留在想的阶段,这次终于在有机会见识世界一流C++程序员编写的代码。当时的心情不是能用“兴奋”来形容的,好像明教的某一小卒突然发现自己可以潜心修炼乾坤大挪移心法,似乎了看到不久将来的自己身怀绝技,能以一敌百,成为举世瞩目的大英雄。所以,马上开始Boost Graph Lib的学习旅程。
     安装准备:主机安装有vs2008,Packet iX, 有道词典
     步骤:
           1, 下载:首先是找到boost的官网:www.boost.org. 双击右侧的 Get Started,在新的页面右下角有“next”, 选择windows OS,在
                         http://www.boostpro.com/download/  下载安装版的BGL。但是没法打开链接,页面老被重置。最后使用Vpn软件 Packet iX。
                        进入下载页面了,找到32位的最新版本 “BoostPro 1.51.0 Installer (32-bit) (200K .exe)”,双击下载。
            2,安装:基本上是一路next, 当然安装路径可以选择其它位置。为了学习其它boost库,在安装内容选项勾选了multhread 和 Regex, 在这个窗口的左侧显示需空间                           1.3GB.点击完成后,安装程序开始下载并安装。整个安装过程估计要二十多分钟。跟网速有关系。
            3,设置:打开vs2008, 工具--选项--项目--vc++目录设置,右侧的下拉菜单选“包含文件”,添加boost的头文件路径,
                        我的安装路径是:C:\Program Files\boost\boost_1_51\boost; 因为boost是header-only形式,即将类的实现与类的定义放在同一文件,所以不用
                        再设置库文件和可执行文件。接着,再设置环境变量
                        左击计算机--属性--高级系统设置--环境变量设置,若原先有INCLUDE变量则将刚才在vs2008添加的路径附加进去(且“;”隔开),否则新建一INCLUDE变
                        量,再添加。
           进入dos窗口命令提示符:crtl+R---cmd, 输入set。完成设置。此时可以在vs2008IDE中编写使用boost库的代码。
     
     接下来的一下午和一晚上都在试探性地学习BGL。虽然在网站上介绍很全面,但是一些概念的介绍没循序进行。看得有点累,觉得还是下载《Boost Graph Library:user         guid and mammaul》 来看比较好。因为我的任务是使用而且时间有限,现在只能学习如何定义对象和使用对象的函数以及算法的作用。至于其它更为精致的内容,等任务完成
后再来研究。


                       
posted @ 2012-10-26 08:18 星哥 阅读(1021) | 评论 (0)编辑 收藏

仅列出标题
共3页: 1 2 3