STL学习笔记一(深入VC之STL系列)

STL文件组成(加<>的目的是为了更好的说明其文件特性)

1:<climits>内中包含limits.h文件,在limits.h文件内,定义了每种内置类型的bit,字节,最大最小数等,部分内容如下。

#define CHAR_BIT      8         /* number of bits in a char */
#define SCHAR_MIN   (-128)      /* minimum signed char value */

#define INT_MIN     (-2147483647 - 1) /* minimum (signed) int value
#define INT_MAX       2147483647    /* maximum (signed) int value */
其中还包括#include <yvals.h>,这个文件是Microsoft需要的文件,具体内容和STL有关

#if defined(__cplusplus)
  #define _STD_BEGIN   namespace std {
  #define _STD_END     }
  #define _STD     ::std::
就是定义std宏。

这个文件中还定义vc编译器需要的环境变量,库(在其他文件内声明#include <use_ansi.h>),_Lockit类,  _Mutex类,线程等

VC7.1中使用的STL依然是P.J. Plauger的STL库,如下是摘抄climits文件内的版权说明,本来偶还认为从VC7.0开始,就是用自己开发的STL库,原来还是使用的P.J.Plauger版本的STL库,不知道VC8.0有没有改变

/*
 * Copyright (c) 1992-2002 by P.J. Plauger.  ALL RIGHTS RESERVED.
 * Consult your license regarding permissions and restrictions.
 V3.13:0009 */

2:<utility>,定义STL中pair模版类和相关的函数,我们常用的make_pair函数就是在这个文件中定义,其原型为

template<class _Ty1,
     class _Ty2> inline
     pair<_Ty1, _Ty2> __cdecl make_pair(_Ty1 _Val1, _Ty2 _Val2)
     {    // return pair composed from arguments
     return (pair<_Ty1, _Ty2>(_Val1, _Val2));
     }

可见是返回pair的一个临时对象(当然可以直接返回值优化掉,不用担心),根据文件最后的注释,发现这个pair是1994年HP定义的版本STL(好老啊)

文件中还包括#include <iosfwd>,



3: <cstdio>,内部包括stdio.h文件,并在cstdio中声明using ::size_t;等,同时文件也包括#include <yvals.h>,microsoft定义的一个文件,里面有很多宏定义,决定如何STL使用,在后面的很多文件内都包含此文件,将不在一一列出。

4:<cstring>,内部包含string.h文件,此文件内定义的是操作字符串的函数集,在此文件内,大部分宏的声明与stdio.h文件内的宏声明相同。不知道为什么ms要如此做,这里声明了我们常用的strcmp,strstr,memcpy等函数

5:<iosfwd>,内部包括#include <cstdio>,#include <cstring>,#include <cwchar>,#include <xstddef>,内部声明模版fpos类(TEMPLATE CLASS fpos (from <streambuf>))并声明streampos,其原形为
typedef fpos<mbstate_t> streampos; // 其中mbstate_t为int类型
typedef streampos wstreampos;,

之后声明模版类char_traits(TEMPLATE STRUCT char_traits (FROM <string>)), 然后有char和wchar的两个特化char_traits,最后声明各种i/o操作的类,根据iosfwd的名字我们不难推断出来(fwd是forword的缩写),这个文件是为了提前声明io操作的文件,以方便编译使用。

6:<cwchar>,内部包含wchar.h文件,主要定义了关于操作宽字符的函数,宏,类型等

7:<xstddef>,定义一些宏,主要是异常宏的声明,内部包含stddef.h文件,此文件中主要定义一些公共宏,函数和类型

8:<xutility>文件内#include <climits>,#include <utility>,这个文件比较长,主要声明的是迭代器相关类// TEMPLATE CLASS iterator
template<class _Category,
     class _Ty,
     class _Diff = ptrdiff_t,
     class _Pointer = _Ty *,
     class _Reference = _Ty&>
         struct iterator
     {    // base type for all iterator classes
     typedef _Category iterator_category;
     typedef _Ty value_type;
     typedef _Diff difference_type;
     typedef _Diff distance_type;     // retained
     typedef _Pointer pointer;
     typedef _Reference reference;
     };

还有一些对比函数比如lexicographical_compare,fill,equal,mismatch,copy_backward等函数

9:<iterator>迭代器类中主要包含文件就是#include <xutility>,此类中定义迭代器类front_insert_iterator,back_insert_iterator,insert_iterator等

10:<memery>类包含#include <iterator>,#include <xmemory>,memery类中定义大量操作内存的函数,大部分函数都是STL内部调用。不过这里面有一个我们非常熟悉的模版类auto_ptr

// TEMPLATE CLASS auto_ptr
template<class _Ty>
     class auto_ptr;

template<class _Ty>
     struct auto_ptr_ref
         {    // proxy reference for auto_ptr copying
     auto_ptr_ref(auto_ptr<_Ty>& _Right)
         : _Ref(_Right)
         {    // construct from compatible auto_ptr
         }
     auto_ptr<_Ty>& _Ref;   // reference to constructor argument
     };

template<class _Ty>
     class auto_ptr
         {    // wrap an object pointer to ensure destruction
public:
     typedef _Ty element_type;
     explicit auto_ptr(_Ty *_Ptr = 0) _THROW0()
         : _Myptr(_Ptr)
         {    // construct from object pointer
         }

     auto_ptr(auto_ptr<_Ty>& _Right) _THROW0()
         : _Myptr(_Right.release())
         {    // construct by assuming pointer from _Right auto_ptr
         }

     auto_ptr(auto_ptr_ref<_Ty> _Right) _THROW0()
         : _Myptr(_Right._Ref.release())
         {    // construct by assuming pointer from _Right auto_ptr_ref
         }

     template<class _Other>
         operator auto_ptr<_Other>() _THROW0()
         {    // convert to compatible auto_ptr
         return (auto_ptr<_Other>(*this));
         }

     template<class _Other>
         operator auto_ptr_ref<_Other>() _THROW0()
         {    // convert to compatible auto_ptr_ref
         return (auto_ptr_ref<_Other>(*this));
         }

     template<class _Other>
         auto_ptr<_Ty>& operator=(auto_ptr<_Other>& _Right) _THROW0()
         {    // assign compatible _Right (assume pointer)
         reset(_Right.release());
          return (*this);
         }

     template<class _Other>
         auto_ptr(auto_ptr<_Other>& _Right) _THROW0()
         : _Myptr(_Right.release())
         {    // construct by assuming pointer from _Right
         }

     auto_ptr<_Ty>& operator=(auto_ptr<_Ty>& _Right) _THROW0()
         {    // assign compatible _Right (assume pointer)
         reset(_Right.release());
         return (*this);
         }

     auto_ptr<_Ty>& operator=(auto_ptr_ref<_Ty>& _Right) _THROW0()
         {    // assign compatible _Right._Ref (assume pointer)
         reset(_Right._Ref.release());
         return (*this);
         }

     ~auto_ptr()
         {    // destroy the object
         delete _Myptr;
         }
     _Ty& operator*() const _THROW0()
         {    // return designated value
         return (*_Myptr);
         }

     _Ty *operator->() const _THROW0()
         {    // return pointer to class object
         return (&**this);
         }

     _Ty *get() const _THROW0()
         {    // return wrapped pointer
         return (_Myptr);
         }

     _Ty *release() _THROW0()
         {    // return wrapped pointer and give up ownership
         _Ty *_Tmp = _Myptr;
         _Myptr = 0;
         return (_Tmp);
         }

     void reset(_Ty* _Ptr = 0)
         {    // destroy designated object and store new pointer
         if (_Ptr != _Myptr)
              delete _Myptr;
         _Myptr = _Ptr;
         }
private:
     _Ty *_Myptr;  // the wrapped object pointer
     };

通过源代码分析,我们可以看到auto_ptr并没有什么神秘的,他定义一个代理对象保存其指针对象(当然也可以不这么做),并且通过源代码我们就可以清楚认识到对象所有权的转移,如果使用boost的shared_ptr(使用引用计数机制)就不会有对象所有权的转移,这里唯一需要解释的是在一些类的定义前面有这么一句template<class _Other>,在函数前使用template<class _Other>的目的就是可以使auto_ptr接受(处理)不同于原类型的指针或者auto_ptr对象,这种限制在类的继承体系中十分有用,具体参考2。

 

时间: 2024-09-25 03:10:58

STL学习笔记一(深入VC之STL系列)的相关文章

STL学习笔记二(仿函式)

简介:<functional>文件包含的大量的模版类unary_function,binary_function,plus,miuns, multiplies, divides, modulus, negate, equal_to, not_equal_to, greater, less, greater_equal, less_equal, logical_and, logical_or, logical_not, unary_negate, binary_negate,binder1st,

C++ STL 学习笔记

#.string 建议   使用string 的方便性就不用再说了,这里要重点强调的是string的安全性.       string并不是万能的,如果你在一个大工程中需要频繁处理字符串,而且有可能是多线程,那么你一定要慎重(当然,在多线程下你使用任何STL容器都要慎重).   string的实现和效率并不一定是你想象的那样,如果你对大量的字符串操作,而且特别关心其效率,那么你有两个选择,首先,你可以看看你使用的STL版本中string实现的源码:另一选择是你自己写一个只提供你需要的功能的类.

我的Android进阶之旅------&amp;gt;Android中编解码学习笔记

编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放license收费等等.最近因为项目的关系,需要理清媒体的codec,比较搞的是,在豆丁网上看运营商的规范 标准,同一运营商同样的业务在不同文档中不同的要求,而且有些要求就我看来应当是历史的延续,也就是现在已经很少采用了.所以豆丁上看不出所以然,从 wiki上查.中文的wiki信息量有限,很短,而wiki的英文内容内多,

STL学习系列之三:操作list容器

学习完了STL系列之二,自己写了个程序练手!程序采用的还是系列之二文章的架构.学习了STL之一和之二,对于STL的基本原理算有个个基本的了解.其实关于这几种容器,以前也都接触过,不过是在java上,当时学习时也是囫囵吞枣!现在感觉那真是学习之大忌,还是一步一个脚印为好.速度可以放慢点,那要扎实! 注意:程序在vc6下调试通过,对于不清楚如何在vc下运行STL者,可以读STL系列之一. //TjuAiLab //Author:zhangbufeng //Time:2005.8.23 22:00 #

STL学习小结 .

from:http://blog.csdn.net/byxdaz/article/details/4633826#comments STL就是Standard Template Library,标准模板库.这可能是一个历史上最令人兴奋的工具的最无聊的术语.从根本上说,STL是一些"容器"的集合,这些"容器"有list, vector,set,map等,STL也是算法和其它一些组件的集合.这里的"容器"和算法的集合指的是世界上很多聪明人很多年的杰作

孙鑫VC学习笔记:ActiveX 控件 .

孙鑫VC学习笔记:ActiveX 控件 作者:华仔 | 录入时间:2007-12-26 | 点击:313 次    打印此文章 | 字体:大 中 小 基本概念: 容器和服务器程序       容器应用程序时可以嵌入或链接对象的应用程序.Word 就是容器应用程序.服务器应用程序是创建对象并且当对象被双击时,可以被启动的应用程序.Excel 就是服务器应用程序.ActiveX 控件不能独立运行,它必须被嵌入容器应用程序中,和容器应用程序一起运行. -------------------------

VC文件过滤系统驱动开发Filemon学习笔记

WINDOWS文件过滤系统驱动开发,可用于硬盘还原,防病毒,文件安全防护,文件加密 等诸多领域.而掌握核心层的理论及实践,对于成为一名优秀的开发人员不可或缺. WINDOWS文件过滤系统驱动开发的两个经典例子,Filemon与SFilter,初学者在经 过一定的理论积累后,对此两个例子代码的研究分析,会是步入驱动开发殿堂的重要一步 ,相信一定的理论积累以及贯穿剖析理解此两个例程后,就有能力开始进行文件过滤系统 驱动开发的实际工作了. 对于SFilter例子的讲解,楚狂人的教程已经比较流行, 而F

STL学习系列之一:C++ STL轻松导学

目录1 初识STL:解答一些疑问 1.1 一个最关心的问题:什么是STL 1.2 追根溯源:STL的历史 1.3 千丝万缕的联系 1.3.1 STL和C++ 1.3.2 STL和C++标准库 1.3.3 STL和GP,GP和OOP 1.4 STL的不同实现版本 1.4.1 HP STL 1.4.2 P.J. Plauger STL 1.4.3 Rouge Wave STL 1.4.4 STLport 1.4.5 SGI STL 2 牛刀小试:且看一个简单例程 2.1 引子 2.2 例程实作 2.

STL学习系列之一——标准模板库STL介绍

库是一系列程序组件的集合,他们可以在不同的程序中重复使用.C++语言按照传统的习惯,提供了由各种各样的函数组成的库,用于完成诸如输入/输出.数学计算等功能. 1. STL介绍 标准模板库STL是当今每个从事C++编程的人需要掌握的技术,所有很有必要总结下 本文将介绍STL并探讨它的三个主要概念:容器.迭代器.算法. STL的最大特点就是: 数据结构和算法的分离,非面向对象本质.访问对象是通过象指针一样的迭代器实现的: 容器是象链表,矢量之类的数据结构,并按模板方式提供: 算法是函数模板,用于操作