2.19号c++

1.auto

1.1 概念

C++11引入了自动类型推导,和Python不一样,C++中需要auto关键字引导。

1.2 作用

auto修饰变量时,可以自动推导出变量的数据类型

1.3 注意

1> auto修饰变量时,必须初始化

2> auto的右值,可以是右值,可以是表达式,也可以是函数的返回值

3> auto不能修饰函数的形参

4> auto不能修饰数组

5> auto不能修饰非静态数据成员

1.4 用途

1> auto 一般修饰数据类型表冗长的类型。

2> auto还可以修饰依赖模板参数的类型

3> auto可以修饰lambda表达式。

2.lambda表达式 (C++11)

2.1 作用

当需要一个匿名的,临时的,可以捕获外界变量的函数时,可以用lambda表达式完成。

2.2 格式

[](){} //lambda表达式

 

//auto fun = [a,b]()mutable{  //对a,b进行值捕获
    //auto fun = [=]()mutable{  //对外界所有的变量进行值捕获
    //auto fun = [&a,&b](){  //对a,b进行引用捕获
    auto fun = [&](){  //对外界所有的变量进行引用捕获
        cout << "a = " << a << "  &a = " << &a << endl;


        a = 200;
        cout << "a = " << a << "  &a = " << &a << endl;


        cout << b << endl;


    };


    fun();

3.C++中的数据类型转换

3.1 概念

C++中存在多种数据类型的转换方式,用于在不同的数据类型之间进行转换。

3.2 种类

1>隐式类型转换(自动类型转换)

2>显示类型转换(强制类型转换)

3> C风格类型转换

3.3 注意

需要注意的是,尽管C++提供了多种类型转换方式,但应该谨慎使用,以避免潜在的错误和问题。特别是在使用强制类型转换时,务必确保转换操作是安全的,以避免不必要的问题。

4.异常

可以优雅解决代码中的异常

try ------> 将可能发生异常的地方用try进行包裹

throw ------> 将发生异常的地方,使用throw进行抛出异常

catch ------> 使用catch接收异常

5.C++标准模板库 (STL)

C++中的标准模板库 (Standard Template Library),STL是标准库之一。

标准模板库中提供大量的函数模板和类模板,用来对数据结构的处理。

STL 的组成:容器、算法、迭代器

容器:置物之所也

数组、链表、二叉树、哈希、、

算法:问题之解法也

增、删、改、查

迭代器:是容器和算法之间的粘合剂 (== 指针)

5.1 vector 容器

vector就是数组,也称为单端数组,和普通数组有区别,普通数组是静态空间,而vector的空间时动态拓展。

动态拓展,不是在原来空间后面续接新的空间,而是,重新申请空间,将原来空间里的数据,复制到刚刚申请的空间中,再释放原来的空间。

5.2 vector构造函数

函数原型:

vector< T > v; //无参构造

vector(const vectcor &v) ; //拷贝构造函数

vector(n,elem); //将n个elem拷贝给对象本身

vector(v.begin(),v.end()); //将区间[v.begin(),v.end())拷贝给对象本身

5.3 vector赋值函数

函数原型:

vector &operator=(const vector &v); //拷贝赋值函数

assgin(v.begin(),v.end()); //将区间[v.begin(),v.end())赋值给对象本身

assgin(n,elem); //将n个elem赋值给对象本身

5.4 vector的容量大小

empty() ; //判读容器是否为空

size(); //容器的大小,元素的个数

capacity(); // 容量的大小

resize(); //重新设置大小

5.5 vector的插入和删除

push_back(); //尾插

pop_back(); //尾删

insert(iterator_pos, elem); //在迭代器所指向的位置插入数据

insert(iterator_pos, n,elem);//在迭代器所指向的位置插入n个数据

eraser(v.begin(),v.end()); //将区间[v.begin(),v.end())的元素删除

clear(); //清空

6.list

7.智能指针

7.1引入背景

1> C++中在堆区申请空间和释放空间需要使用new和delete完成

2> 多个指针指向同一个内存空间,释放其中一个的空间,另一个还在继续使用 (悬空指针)

3> 只是申请了内存空间,使用后忘记释放内存空间,堆区对象没有得到析构

4> 栈取申请的对象空间,在脱离对象空间后,会自动调用析构函数完成资源的回 收,但是堆区的不会自动释放

5> 总结:上述例子中,在堆区申请一个对象空间,但是没有手动释放空间,造成 对象没有析构,为了保证堆区空间使用的安全性,我们引入了智能指针,目的是更加 安全的使用堆区空间。

7.2类型

1> C++11标准提供了两种智能指针,分别是unique_ptr(独占智能指针)、 shared_ptr(共享智能指针)

2> 除了上述两种指针外,还有auto_ptr(自动智能指针,已弃用)、weak_ptr (弱智能指针,辅助shared_ptr作用)

3> 以上所有智能指针都在头文件:#include

4> 智能指针是类模板,在栈区创建智能指针对象

5> 把普通指针交给智能指针管理

6> 智能指针对象过期时,析构函数会自动释放智能指针管理的指针空间

你可能感兴趣的:(笔记)