读书笔记之:C++标准库扩展权威指南
这本书主要介绍的是C++标准的TR1库。对相关的库都进行了介绍。类似一个参考手册。
前言
C++ TR1库简介
-
元组tuple
-
元组的tuple的声明
2. 创建tuple对象
使用make_tuple函数来创建tuple对象,但是make_tuple并不区分对象和对象的引用,两者都会得到和对象相同 类型的成员。
TR1库中的函数模板ref和cref可以创建包含引用的tuple对象。在头文件<functional>中定义。cref告诉make_tuple所要创建的成员是对常量类型的引用。
函数模板tie可以创建tuple对象包含对参数的引用。
程序代码:make_tuple.cc
#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
#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
#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
#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
#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语言兼容