C++ Primer 第Ⅱ部分笔记

向算法传递函数

向排序算法传递二元谓词

定义isSHorter方法

bool isShorter(const int &i,const int& j)
{
    return i<j;
}
vecotr<int>nums = {5,4,1,2.3);
sort(nums.begin(),nums.end(),isShorter);

lambda表达式

有些算法只能传递一元谓词,不能传递多元谓词,这时候lambda表达式就有效了

比如find_if函数接收一个一元谓词

int num = 3;
find_if(nums.begin(), nums.end(), [num](const int& i) {return i > num; });

[]里面为捕获列表,lambda表达式与函数类似,只有捕获列表,全局变量,全局静态变量,参数可在花括号中使用

lambda表达式的捕获

1值捕获与引用捕获

这点与函数类似

隐式捕获

值的隐式捕获: [=];

引用的隐式捕获:[&]

若使用了某种隐式捕获,那么其他捕获必须是另一种捕获

可变lambda

若想对拷贝的值进行修改,必须在参数列表后加上 mutable 关键字

返回

lambda表达式内不可有两句返回语句,如果必须使用

那么必须使用尾置返回类型

只需在参数列表后加上

->typename

即可使用多return语句

shared_ptr类

初始化语句

shared_ptr<int>p1;
p1=make_shared<int>(42);//使用make_shared函数
shared_ptr<int>p2=make_shared<int>();//默认初始化
shared_ptr<int>p3(new int(42));//使用new初始化

拷贝

shared_ptr p4(p1);//直接拷贝
shared_ptr<int> p5 = p1;//间接拷贝

拷贝之后,指向那个地址的引用数加1,若引用数为0,则该内存自动释放

自动释放内存

void f()
{
     shared_ptr<int> p1 = make_shared<int>(42);
}
//代码块结束,该内存自动释放
shared_ptr<int> f()
{
     shared_ptr<int> p1 = make_shared<int>(42);
     return p1;
}
//代码块结束,内存不会释放,在引用数为1时才会自动释放

shared_ptr 的改变方法

shared_ptr<T>p(q);//若q为new管理的内存,则不必delete q;
shared_ptr<T>p(q,d);//p接管了q指针所管理的内存,并且使用d方法进行删除p
p.reset();//将引用数减1,若引用数为0,则进行删除操作
p.reset(q,d);//将p指针指向q,删除操作利用d方法

unique_ptr智能指针

基本用法

unique_ptr<T,D>u(q,d);//与上面的d方法删除类似
//举例,假设有方法D(),class q则可以这样写
unique_ptr(int,decltype(D)*>u(&q,D);
u.release();//u放弃对指针的控制权,返回指针,并置空
u.reset();//释放u所指的对象
u = nullptr;//释放对象并且将u置空
u.reset(q);
u.reset(nullptr);

不可使用make_shared函数

分配动态数组

unqiue_ptr<T[]>u(new T [SIZE] );

allocator类

allocator<T>a;
auto p = a.allocate(n);//分配n大小的内存
auto q = p;
a.constrcut(q,args);//args为类型为T的构造函数如  string 的 构造函数  (10,'c')  不用括号,用逗号隔开
while(q!=p)  a.destory(q---);销毁元素
a.deallocate(p,n);//释放内存,向系统归还内存