《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如下:(注意其成员)
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 <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 <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 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() 立即终止程序而不做清理.