《STL Tutorial Reference》Chapt 4 Utility

1. pair
<utility>

函数
template <typename T1, typename T2>
pair<T1, T2> make_pair(const T1 &x  ,const T2 &y)


注意:
pair<int, float>(10, 7.77)

make_pair(10, 7.77)
是不同的,因为浮点字符常量默认是double型

2. auto_ptr
<memory>

注意:auto_ptr规定了严格的ownership, 多个auto_ptr不能拥有相同的对象。因为可能造成多次自动释放的错误。

1)auto_ptr不能分享所有权

2)auto_ptr不能用于对数组提供自动指针

3)auto_ptr也不适合容器元素的要求

4)auto_ptr不提供对象引用计数的功能

3. Numeric limits
C在<limits.h>, <float.h>或<climits>, <cfloat>中提供了预处理常量来用作numeric limits的功能
STL又增加定义了numeric_limits模板来用作此目的
优势:
1)更多的类型安全
2)

template<typename T>
class numeric_limits
{
public:
    static const bool is_specialized = false;
    static T min() throw() { //...}
    static T max() throw() { //...}
    static const int digits;
//...
};

特别的,对于float类型,完整的numeric_limits如下:(注意其成员)

class numeric_limits<float> { 
        
public
          
//yes, a specialization for numeric limits of float does exist 
          static const bool is_specialized = true
 
          inline 
static float min() throw() {  return 1.17549435E-38F; }  
          inline 
static float max() throw() {  return 3.40282347E+38F; } 
 
          
static const int digits = 24
          
static const int digits10 = 6
          
static const bool is_signed = true
          
static const bool is_integer = false
          
static const bool is_exact = false
          
static const bool is_bounded = true
          
static const bool is_modulo = false
          
static const bool is_iec559 = true

          
static const int radix = 2
 
          inline 
static float epsilon() throw() { return 1.19209290E-07F;} 
 
          
static const float_round_style round_style = round_to_nearest; 
          inline 
static float round_error() throw() { return 0.5F; } 
 
          
static const int min_exponent = -125
          
static const int max_exponent = +128
          
static const int min_exponentl0 = -37
          
static const int max_exponent10 = 38
          
          
static const bool has_infinity = true
          inline 
static float infinity() throw() { return ; } 
          
static const bool has_quiet_NaN = true
          inline 
static float quiet_NaN() throw() { return ; } 
          
static const bool has_signaling_NaN = true
          inline 
static float signaling_NaN() throw() { return ; } 
          
static const float_denorm_style has_denorm = denorm_absent; 
          
static const bool has_denorm_loss = false
          inline 
static float denorm_rain() throw() { return min(); } 
 
 
          
static const bool traps = true
          
static const bool tinyness_before = true;  
      }; 
   } 


下面是测试用例:

#include <climits>
#include 
<iostream>
using namespace std;

int main()
{
    cout 
<< numeric_limits<unsigned int>::digits << "\n"//32
    cout << numeric_limits<int>::digits << "\n";//31

    cout 
<< numeric_limits<unsigned int>::max() << "\n"//4294967295
    cout << numeric_limits<int>::max() << "\n";//2147483647

    cout 
<< numeric_limits<unsigned int>::epsilon() << "\n"//0
    cout << numeric_limits<int>::epsilon() << "\n";//0

    cout 
<< numeric_limits<float>::epsilon() << "\n"//1.19209e-007
    cout << numeric_limits<double>::epsilon() << "\n";//2.22045e-016

    system(
"PAUSE");
    
return 0;
}

5. 三个辅助函数min(),max(),swap()
位于<algorithm>

template <typename T>
inline const T& min(const T &a, const T &b)
{
    return b < a ? b : a;
}

template <typename T>
inline const T& max(const T &a, const T &b)
{
    return b > a ? b : a;
}
但是,函数也提供了比较准则:
template <typename T, typename Compare>
inline const T& min(const T &a, const T &b, Compare comp)
{
    return comp(b, a) ? b : a;
}

template <typename T, typename Compare>
inline const T& max(const T &a, const T &b, Compare comp)
{
    return comp(b, a) ? b : a;
}

测试用例:

#include <algorithm>
#include 
<iostream>

using namespace std;

bool comp_rule(int *px, int *py)
{
    
return *px < *py ? true :false;

}

int main()
{
    
int x = 17, y = 42;
    
int *px =&x, *py = &y;
    cout 
<< "The greater: " << *max(px, py, comp_rule) << endl;
    cout 
<< "The smaller: " << *min(px, py, comp_rule) << endl;

    system(
"PAUSE");
    
return 0;
}

swap()模板函数可以交换两个对象
最大的优势在于所有的容器和string都特化了swap,这样可以很方便的交换容器对象

6。 辅助的比较操作符
位于<utility>

4个比较操作符 !=,  >, >=, <=

namespace std
{
  
namespace rel_ops
  {
    template 
<class _Tp>
      inline 
bool
      
operator!=(const _Tp& __x, const _Tp& __y)
      { 
return !(__x == __y); }

    
      template 
<class _Tp>
      inline 
bool
      
operator>(const _Tp& __x, const _Tp& __y)
      { 
return __y < __x; }


    template 
<class _Tp>
      inline 
bool
      
operator<=(const _Tp& __x, const _Tp& __y)
      { 
return !(__y < __x); }

    
      template 
<class _Tp>
      inline 
bool
      
operator>=(const _Tp& __x, const _Tp& __y)
      { 
return !(__x < __y); }

  } 
// namespace rel_ops
// namespace std

注意,这几个比较操作符并非定义在全局域std中,而是在子域:rel_ops
要使用,using namespace std::rel_ops

这种实现的优势在于提供不同类型间的可比较

7. <cstddef>和<cstdlib>
它们是C的头文件<stddef.h>和<stdlib.h>新的版本

<cstddef>中的定义:
NULL  
size_t  - 无符号的size
ptrdiff_t  - 指针差的有符号数
offsetof()  - 成员在struct或union中的offset

<cstdlib>中的定义:
exit(int status)  - 退出程序,清理静态对象
EXIT.SUCCESS
EXIT.FAILURE
abort()
atexit(void(*function)())  - 退出时调用函数


exit()和abort()可以在任何函数中终止程序,而不需要回到main():
exit() 销毁所有静态对象, 刷新所有buffer, 关闭所有I/O通道, 并终止程序(包括调用atexit()函数)。如果传递到atexit()的函数抛出异常,terminate()被调用。
abort() 立即终止程序而不做清理.


posted @ 2007-10-25 10:57  中土  阅读(775)  评论(0编辑  收藏  举报
©2005-2008 Suprasoft Inc., All right reserved.