随笔-156  评论-223  文章-30  trackbacks-0
 
     摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->  1/***************************************************************************************&...  阅读全文
posted @ 2011-08-27 15:12 春秋十二月 阅读(2612) | 评论 (0)编辑 收藏
     摘要: 类型定义    在多叉树中,叶子遍历迭代器有只读、读写、只读反转、读写反转4种,在mtree容器中的定义如下: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->1  &nb...  阅读全文
posted @ 2011-08-25 10:35 春秋十二月 阅读(2173) | 评论 (0)编辑 收藏
     摘要: 类型定义    在多叉树中,兄弟遍历迭代器有只读、读写、只读反转、读写反转4种,在mtree容器中的定义如下: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->1   ...  阅读全文
posted @ 2011-08-20 21:06 春秋十二月 阅读(1710) | 评论 (0)编辑 收藏
方法1:使用find和xargs命令
     find dir | xargs grep str,dir是指某个目录
     find file | xargs grep str,file是指某个文件
   注意:这种方法,会递归搜索子目录

方法2:直接使用grep命令
     grep str dir/*,dir是指某个目录,但不递归搜索其子目录
     grep -r str dir/*,使用-r选项,递归搜索其子目录
     grep str file,file是指某个文件

方法3:综合以上两种,写一个shell脚本,代码如下 
 1#! /bin/bash
 2# findstr.sh   
 3
 4if [ $# -lt "2" ]; then
 5   echo "Usage: `basename $0` path name [option]"
 6   exit 1
 7fi   
 8
 9path=$1
10name=$2  
11shift 
12shift   
13
14for option in "$@"
15do
16   case $option in
17   -r) dir_op="-r"
18   ;;
19   -i) lu_op="-i"
20   ;;
21   *if [ -"$option" ]; then
22         echo "invalid option"
23         exit 1
24       fi
25   ;;
26  esac
27done    
28
29grep_str_of_file()
30{
31     file=$1
32     str=$2
33     out=$(grep -n $lu_op "$str" "$file")
34     if [ -"$out" -"$file" != "$0" ]; then
35        echo "$file: $out"
36     fi
37}    
38
39find_str()
40{
41  if [ -"$1" ]; then
42     for file in $1/*
43      do
44        if [ "$dir_op" = "-r" --"$file" ]; then
45            find_str $file $2
46        elif [ -"$file" ]; then
47           grep_str_of_file $file $2
48        fi
49     done
50 elif [ -"$1" ]; then
51   grep_str_of_file $1 $2    
52 fi
53}  
54
55find_str $path $name
  这样一来,不管$1参数是目录还是文件,都能处理,使用示例如下:
    findstr /usr/include main          不递归搜索子目录,大小写敏感
    findstr /usr/include main -i       不递归搜索子目录,忽略大小写
    findstr /usr/include main -r       递归搜索子目录,大小写敏感
    findstr /usr/include main -r  -i   递归搜索子目录,忽略大小写
 
    findstr main.cpp main              在文件中搜索,大小写敏感
    findstr main.cpp main -i           在文件中搜索,忽略大小写 

  上面所述的示例中,str不限于特定的文本,可以是带正则表达式的匹配模式。而第3种方法,也可以用sed替换grep来显示文本行,在此基础上能作更多的处理,比如格式化显示、统计匹配的文本个数、搜索策略等,在此就不详究了。
posted @ 2011-08-20 19:46 春秋十二月 阅读(2448) | 评论 (0)编辑 收藏
     摘要: 类型定义    在多叉树中,后序遍历迭代器有只读、读写、只读反转、读写反转4种,在mtree容器中的定义如下: Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->1 &nb...  阅读全文
posted @ 2011-08-15 12:51 春秋十二月 阅读(1899) | 评论 (2)编辑 收藏
     摘要: 类型定义    在多叉树中,前序遍历迭代器有只读、读写、只读反转、读写反转4种,在mtree容器中的定义如下: Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->1  &n...  阅读全文
posted @ 2011-08-14 13:30 春秋十二月 阅读(2765) | 评论 (0)编辑 收藏
     摘要: 迭代器的分类与框架    迭代器是一种设计模式,用来访问容器对象的内容而无须暴露容器的内部实现,而多叉树是一种具有递归性质的复合对象,因此它的迭代器是一种复合迭代器,且存在多种遍历顺序和策略,如前序、后序、广度、叶子、兄弟等,为了支持实现这种复合迭代器,就需要设计不同的迭代器类,由于迭代器封装了对多叉树的访问,而这种访问又可分为只读和读写两类,它们在stl中的实现就...  阅读全文
posted @ 2011-07-31 07:55 春秋十二月 阅读(2704) | 评论 (0)编辑 收藏
     摘要:    在面向对象开发时,对实际问题分析进而抽象出一种类型,往往会考虑到2个方面:1)类型的内部成员和方法的定义描述 2)类型的多实例存取操作。其中第1点是类型本身数据结构的设计,第2点是类型容器数据结构的选择设计。在stl中,容器有序列式和关联式两种,前者代表有vector,list,deque等;后者代表有set,multiset,map,multimap等,对于一...  阅读全文
posted @ 2011-07-16 12:23 春秋十二月 阅读(1874) | 评论 (0)编辑 收藏
     摘要: 需求分析    在数据结构中,树有两种存储方式,一种是链式存储,另一种是顺序存储。前者就是使用指针来记录树结点间的关系,在新增结点或删除结点时,只需改变与父结点或兄弟结点的指针值即可,实现较为简单;后者就是使用数组来存储,可以用相对偏移量来记录树结点间的关系,在新增结点或删除结点时,则不仅是改变与父结点或兄弟结点的相对偏移量,还需要改变其它结点的相对偏移量,实现较为...  阅读全文
posted @ 2011-07-13 15:10 春秋十二月 阅读(4490) | 评论 (9)编辑 收藏
继承情景
   我们知道一个空的类,也就是其内部没有非静态数据成员,没有虚指针(包括指向虚函数表和虚基类子对象的指针),它的大小通常为1,当然在某些对齐要求严格系统上可能是另一个数(通常是4),如果空类被继承,那么派生类的大小会怎么样呢?一个支持C++标准和EBO的编译器对此会进行空基类的优化,也就是不给空的基类子对象分配空间,换句话说,空基类子对象的地址和其派生类实例的地址是相同的。从编译器实现的角度来看,需要考虑继承时的不同情况,下图中P表示父类,C表示子类,圆形表示空类,矩形表示非空类。单继承EBO情况如下图所示
   EBO-1反映的是空类派生自空基类,EBO-2反映的是非空类派生自空基类,EBO-3、EBO-4反映的是在继承链中,对空基类的优化能不能传递到后代中。多继承EBO如下图所示
   EBO-5反映的是空类派生自两个空基类,EBO-6反映的是非空类派生自两个空基类,EBO-6反映的是空类派生自一个非空基类和一个空基类,EBO-7反映的是非空类派生自一个非空基类和一个空基类。以上8种情况,不论是单继承还是多继承,一个完全支持EBO的编译器就应该能把空基类部分都优化掉。

优化应用
   由于空基类优化技术节省了对象不必要的空间,提高了运行效率,因此成为某些强大技术的基石,基于类型定义类如stl中的binary_function、unary_function、iterator、iterator_traits的实现复用;基于策略类如内存管理、多线程安全同步的实现复用。当某个类存在空类类型的数据成员时,也可考虑借助EBO优化对象布局,例如下
1template<typename T1,typename T2>
2class EBO
3{
4private:
5    T1 m_t1;
6    T2 m_t2;
7}
;
   当T1和T2为空类时,可以改进如下
1template<typename T1,typename T2>
2class EBO : T1, T2
3{
4}
;
   
   更进一步,如果T1或T2为非类类型,如基本内建类型、函数指针等;或T1和T2类型相同时,则直接继承它们会导致编译错误,怎么办呢?这时可以添加一个中间层来解决,代码如下
 1template<typename T1,typename T2,bool isSame,bool isFirstEmpty,bool isSecondEmpty>
 2class EBO_IMPL;
 3
 4template<typename T1,typename T2>
 5class EBO_IMPL<T1,T2,false,false,false>
 6{
 7    T1 m_t1;
 8    T2 m_t2;
 9}
;
10
11template<typename T1,typename T2>
12class EBO_IMPL<T1,T2,false,true,true> : T1,T2
13{
14}
;
15
16template<typename T1,typename T2>
17class EBO_IMPL<T1,T2,false,true,false> : T1
18{
19    T2 m_t2;
20}
;
21
22template<typename T1,typename T2>
23class EBO_IMPL<T1,T2,false,false,true> : T2
24{
25    T1 m_t1;
26}
;
27
28template<typename T1,typename T2>
29class EBO_IMPL<T1,T2,true,false,false>
30{
31    T1 m_t1;
32    T2 m_t2;
33}
;
34
35template<typename T1,typename T2>
36class EBO_IMPL<T1,T2,true,true,true> : T1
37{
38    T2 m_t2;
39}
;
40
41template<typename T1,typename T2>
42class EBO : EBO_IMPL<T1,T2,boost::is_same<T1,T2>::value,boost::is_empty<T1>::value,boost::is_empty<T2>::value>
43{
44}
;
   为了简便,直接使用了boost中的is_same,is_empty元函数来判断类型的属性,实际上boost中已经实现了EBO的选择运用工具即compressed_pair类模板,研究其源码可发现,该工具充分考虑到了T1和T2实际类型的各种情况,is_empty的判断是运用sizeof来比较类型大小确定的。替换compressed_pair后,代码如下
1template<typename T1,typename T2>
2class EBO: boost::compressed_pair<T1,T2>
3{
4}
;
posted @ 2011-07-10 12:58 春秋十二月 阅读(2588) | 评论 (0)编辑 收藏
仅列出标题
共16页: First 8 9 10 11 12 13 14 15 16