C++ Primer 第Ⅱ部分笔记
1.向算法传递函数
1.1向排序算法传递二元谓词
定义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);
1.2 lambda表达式
有些算法只能传递一元谓词,不能传递多元谓词,这时候lambda表达式就有效了
比如find_if函数接收一个一元谓词
int num = 3;
find_if(nums.begin(), nums.end(), [num](const int& i) {return i > num; });
[]里面为捕获列表,lambda表达式与函数类似,只有捕获列表,全局变量,全局静态变量,参数可在花括号中使用
1.3 lambda表达式的捕获
1.3.1值捕获与引用捕获
这点与函数类似
1.3.2隐式捕获
值的隐式捕获: [=];
引用的隐式捕获:[&]
若使用了某种隐式捕获,那么其他捕获必须是另一种捕获
1.3.3可变lambda
若想对拷贝的值进行修改,必须在参数列表后加上 mutable 关键字
1.3.4返回
lambda表达式内不可有两句返回语句,如果必须使用
那么必须使用尾置返回类型
只需在参数列表后加上
->typename
即可使用多return语句
2. shared_ptr类
2.1初始化语句
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初始化
2.2拷贝
shared_ptr p4(p1);//直接拷贝
shared_ptr<int> p5 = p1;//间接拷贝
拷贝之后,指向那个地址的引用数加1,若引用数为0,则该内存自动释放
2.3自动释放内存
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时才会自动释放
2.4 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方法
3. unique_ptr智能指针
3.1基本用法
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函数
3.2 分配动态数组
unqiue_ptr<T[]>u(new T [SIZE] );
4. 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);//释放内存,向系统归还内存