读书笔记之:C++标准库扩展权威指南

这本书主要介绍的是C++标准的TR1库。对相关的库都进行了介绍。类似一个参考手册。

前言

C++ TR1库简介

  1. 元组tuple
  1. 元组的tuple的声明

2. 创建tuple对象

使用make_tuple函数来创建tuple对象,但是make_tuple并不区分对象和对象的引用,两者都会得到和对象相同 类型的成员。

TR1库中的函数模板ref和cref可以创建包含引用的tuple对象。在头文件<functional>中定义。cref告诉make_tuple所要创建的成员是对常量类型的引用。

函数模板tie可以创建tuple对象包含对参数的引用。

程序代码:make_tuple.cc

View Code
#include <iostream>
#include <typeinfo>
#include <tr1/tuple>
#include <tr1/functional>
using std::tr1::tuple;
using std::tr1::make_tuple;
using std::tr1:: ref;
using std::tr1::cref;
using std::tr1::tie;
using std::tr1::ignore;
using std::cout;
using std::endl;
template < class  T>
void show_type(T){
    cout<<typeid(T).name()<<endl;
}
void test1(){
     int i= 3;
     int& j=i;
    show_type(make_tuple());
    show_type(make_tuple( 1, 3.14));
    show_type(make_tuple(i,j));
}
void test2(){
     int i= 17;
     int j= 3;
    show_type(make_tuple( ref(i),cref(j)));
}
void test3(){
     int i= 1;
     int j= 23;
     int k=- 4;
    cout<<i<< '   '<<j<< '   '<<k<<endl;
    tuple< int, int, int> mytuple;
    mytuple=make_tuple( 5, 6, 7);
    show_type(mytuple);
    tie(i,ignore,k)=mytuple;
    cout<<i<< '   '<<j<< '   '<<k<<endl;
    show_type(tie(i,ignore,k));

}
int main(){
    test3();

     return  0;
}

3. tuple的存取

函数模板get

程序代码:assign.cc

View Code
#include <iostream>
#include <utility>
#include <tr1/tuple>
using  namespace std;
using  namespace std::tr1;
void show( int i, int j, const tuple< int, int&, int>& t){
    cout<<i<< '   '<<j<< " "
        << get< 0>(t)<< '   '
        << get< 1>(t)<< '   '
        << get< 2>(t)<< ' \n ';
}
void show( const tuple< int, int>& t){
    cout<< get< 0>(t)<< '   '
        << get< 1>(t)<< ' \n ';
}
void test1(){
     int i= 1,j= 2;
    tuple< int, int&, int> t0(i,j, 3);
    tuple< int, double, char> t1( 4, 5.1, ' \6 ');
    show(i,j,t0);
    t0=t1;
    show(i,j,t0);
    tuple< int, int> t2( 1, 2);
    show(t2);
    t2=make_pair( 3, 4);
    show(t2);

}
void test2(){
     int i= 1,j= 2;
    tuple< int, int&, int> t0(i,j, 3);
    show(i,j,t0);
     get< 0>(t0)= 4;
     get< 1>(t0)= 5.1;
     get< 2>(t0)= ' \6 ';
    show(i,j,t0);
}
int main(){
    test2();

     return  0;
}
 

4. 类型查询

当需要知道某个tuple包含了多少元素时,可以使用类模板tuple_size    

tuple_element获得元素类型

tuple:http://www.cplusplus.com/reference/std/tuple/tuple/

第2章 智能指针

1. shared_ptr和weak_ptr

这两个没有加入到C++11标准中去。

shared_ptr类模板

weak_ptr类模板

程序源码:

shared_ptr.cc

View Code
#include <tr1/memory>
#include <iostream>
using  namespace std;
using  namespace tr1;
void test1(){
     int *ip= new  int( 3);
    cout<<( void*)ip<<endl;
    shared_ptr< int> sp(ip);
    cout<<( void*)sp. get()<<endl;
    cout<<*sp<<endl;

    cout<<( void*)&*sp<<endl;
}
void test2(){
    shared_ptr< int> sp0;
    cout<< " empty object: "<<sp0.use_count()<< "   "<<sp0.unique()<<endl;
    shared_ptr< int> sp1(( int*) 0);
    cout<< " null pointer: "<<sp1.use_count()<< "   "<<sp1.unique()<<endl;
    shared_ptr< int> sp2( new  int);
    cout<< " one object: "<<sp2.use_count()<< "   "<<sp2.unique()<<endl;
    {
        shared_ptr< int> sp3(sp2);
    cout<< " two object: "<<sp3.use_count()<< "   "<<sp2.unique()<<endl;
    }
    cout<< " one object: "<<sp2.use_count()<< "   "<<sp2.unique()<<endl;
}
int main(){
    test2();
     return  0;
}
 

第3章 容器基础知识

第4章 类模板array

array已经加入到C++11中:http://www.cplusplus.com/reference/stl/array/

tr1同时为array提供了一些全局的函数

程序源代码:

array.cc

View Code
#include <tr1/array>
#include <algorithm>
#include <iostream>
#include <iterator>
using  namespace std;
using  namespace std::tr1;
class elt{
    friend ostream&  operator<<(ostream& , const elt&);
     public:
        elt():i( 1){}
        elt( int ii):i(ii){}
     private:
         int i;
};
ostream&  operator<<(ostream&  out, const elt& el){
     out<<el.i<< '   ';
     return  out;
}
void test1(){
    array<elt, 6> arr0;
    copy(arr0.begin(),arr0.end(),ostream_iterator<elt>(cout, "   "));
    cout<<endl;
    array<elt, 6> arr1={ 1, 2, 3, 4};
    copy(arr1.begin(),arr1.end(),ostream_iterator<elt>(cout, "   "));
    cout<<endl;
    array< int, 6> arr2={ 1, 2, 3, 4};
    copy(arr2.begin(),arr2.end(),ostream_iterator< int>(cout, "   "));
    cout<<endl;
    array< int, 6> arr3;
    copy(arr3.begin(),arr3.end(),ostream_iterator< int>(cout, "   "));
    cout<<endl;
    array< int, 6> arr4={};
    copy(arr4.begin(),arr4.end(),ostream_iterator< int>(cout, "   "));
    cout<<endl;
    array< int, 6> arr5=arr2;
    copy(arr5.begin(),arr5.end(),ostream_iterator< int>(cout, "   "));
    cout<<endl;


}
int main(){
    test1();
}

第5章 无序关系容器

这儿其实就是sgiSTL中所实现的散列表。

已经加入到C++11中:

unordered_map:http://www.cplusplus.com/reference/stl/unordered_map/

unordered_multimap:http://www.cplusplus.com/reference/stl/unordered_multimap/

unordered_multiset:http://www.cplusplus.com/reference/stl/unordered_multiset/

set: http://www.cplusplus.com/reference/stl/unordered_set/

关系容器与无序容器

hash函数

程序hash.cc

View Code
#include <tr1/functional>
#include <iostream>
#include < string>
#include <vector>
#include <iterator>
using  namespace std;
using  namespace std::tr1;
template < class T>
void show_hashes(T first,T last){
    typedef typename iterator_traits<T>::value_type type;
    hash<type> hasher;
     while(first!=last){
        cout<<hasher(*first++)<< '   ';
    }
    cout<<endl;
}
struct coord{
     int x,y;
};
namespace std{
     namespace tr1{
        template <>
         struct hash<coord>{
            std::size_t  operator()( const coord& val) const{
                hash< int> make_hash;
                 return make_hash(val.x)+make_hash(val.y);
            }
        };

    }
}
int test1(){
     int data[]={ 1, 2, 3, 4, 5, 6};
    show_hashes(data,data+ 6);
     char* text[]={ " 1 ", " 2 ", " 3 ", " 4 ", " 5 "};
    vector< string> strs(text,text+ 5);
    show_hashes(strs.begin(),strs.end());
    coord points[]={{ 0, 0},{ 0, 1},{ 1, 0},{ 1, 1},{ 2, 2}};
    show_hashes(points,points+ 5);
     return  0;
}
int main(){
    test1();
}

第6章 调用包装器基础

第14章 正则表达式头文件<regex>

已经加入到标准中

basic_regex: http://www.cplusplus.com/reference/std/regex/basic_regex/

第15章 正则表达式语法

第22章 C语言兼容

转载于:https://www.cnblogs.com/xkfz007/archive/2012/07/18/2597261.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值