一.vector容器简化底层代码新知识点总结(补充)

五.新知识点:
1.std::allocator<T>
介绍:内存分配器,管理容器内内存的分配与释放
成员函数:
*allocate----内存分配函数吗,参数为整型变量表示想要分配对应类型内存的个数
*deallocate-----内存释放函数,参数1为想要释放内存的指针,参数2为想要释放的内存个数
注意:由于所有内存分配的construct函数和destroy函数都执行相同的操作,即调用对应对象的构造函数和调用对应对象的析构函数,如果在每个内存分配器中定义construct函数和destroy函数那么代码过于冗余,所以通过定义一个外部接口---allocator_traits<T>模版类实现代码的复用,allocator_traits<T>模版类的模版参数为内存分配器类型

2.在定义成员函数之前可以利用using关键字对该程序一些常用且后续可能更改的数据类型起别名以方便后续的维护

3.当类需要默认构造函数时,可以使用关键字default使用类自动生成的默认构造函数简化代码 vector()=default;

4.关键字explicit:对单参数构造函数(默认参数不计入)进行限定,限制构造函数的隐式类型转换,以提高代码的安全性
这里我有点疑问是:如果利用关键explicit可以通过限制构造函数的隐式类型转换而提高代码的安全性,那为什么不能在多参数的构造函数上用呢;AL的回答是以前的c++版本是只支持单参数的构造函数,c++11以后的版本支持将关键字explicit用于多参数的构造函数

5.利用范围for遍历容器内的元素,原理是利用迭代器提供一种遍历容器的新格式

6.对于一些简单的获取函数或不可能发生异常且常用的成员函数可以使用关键字noexcept进行限定提高代码的效率

7.std::initializer_list
介绍:能够存放初始化列表元素的模版类
作用:通过该模版类对象存放初始化列表的元素,使自定义类的函数可以支持初始化列表的相关操作,例如:构造函数,赋值运算符重载函数

8.分清楚右值引用变量和右值的区别,右值引用变量本身是一个变量可以对其进行取地址所以可以作为左值使用,只是该变量绑定的是右值,如果想要获取该变量绑定的右值从而调用对应的移动函数需要使用move函数对其进行转换

9.参数包:在原地构造函数中为了省略一次拷贝构造函数的调用,通过直接传递construct函数对象构造函数的参数调高元素的插入效率;这里直接传递构造函数的参数的关键就是参数包,对于本类的原地构造函数来说
*template<typename... Args>中typename... 表示Args是一个模版参数包可以包含0个或多个模版参数类型
*reference emplace_back(Args&&... args)中Args&&表示args是一个函数参数包,其类型和数量与模版参数包Args相同,
注意:这里&&不是右值引用而是完美转发,完美转发---完整保存传入参数的元素特性
*std::allocator_traits<Allocator>::construct(v_allocator,data+size,std::forward<Args>(args)...); 中...表示参数包展开,将每个参数应用与std::forward函数
  
10.std:forward<T>模版函数
介绍:能够通过判断参入参数的原始特性
作用:在原地构造函数中通过完美转发+std::forward<T>模版函数实现保存传入参数完整特性+筛选参入参数的左值右值特性调用对应的构造函数从而提高代码效率

11.可以通过将类放在命名空间中防止命名冲突

二.两道vector容器相关题目

1.力扣编号118.杨辉三角

题解如下:

class Solution 
{
public:
    vector<vector<int>> generate(int numRows) 
    {
        //创建vector容器保存最终答案
        vector<vector<int>> result(numRows);

        for(int i=0;i<numRows;i++)
        {
            //利用resize成员函数调整vector容器的元素个数,并将多出的元素个数初始化为1
            result[i].resize(i+1,1);
            for(int j=1;j<i;j++)
            {
                result[i][j]=result[i-1][j-1]+result[i-1][j];
            }
        }

        return result;
    }
};

2.力扣编号136.只出现一次的数字

该题有最优解法是异或运算符,所以也学习了一下异或运算法同时也回顾了按位或和按位与运算符

异或 ^:

*逻辑规则:相同为0,不同为1

*常用特性:a^a=0  a^0=a  支持结合律和交换律

按位或 |:

*逻辑规则:有1为1,否则为0

*常用特性:a|a=a  a|0=a

按位与 &:

*逻辑规则:全1为1,否则为0

*常用特性:a&a=a  a&0=0  a&1=1/0----->a为奇数/偶数

异或运算符题解:

//异或运算符(^):针对二进制数的运算符
//逻辑规则:对应位相同为0,对应为不同为1
//特性:
//1.a^a=0
//2.a^0=a
//3.支持结合律和交换律


class Solution 
{
public:
    int singleNumber(vector<int>& nums) 
    {
        //定义整型变量保存最终答案
        int result=0;
        //利用范围for遍历容器
        for(int i:nums)
        {
            result^=i;
        }

        return result;
    }
};

vector容器解法

class Solution 
{
public:
    int singleNumber(vector<int>& nums) 
    {
        for(int i=0;i<nums.size();i++)
        {
            //利用STL通用算法find函数在指定范围内查找指定元素
            auto ite=find(nums.begin(),nums.end(),nums[i]);
            
            //判断找到的元素是否为自身
            //如果找到的元素为自身那么说明在该元素之前无相同元素,接着在该元素后寻找
            //如果找到的元素不为自身那么说明该元素之前存在相同元素,进行下一个元素的判断即可
            if((ite-nums.begin())!=i)
            {
                continue;
            }
            else
            {
                ite=find(nums.begin()+i+1,nums.end(),nums[i]);
            }

            if(ite==nums.end())
            {
                return nums[i];
            }
        }

        return 0;
    }
};

三.MySQL数据库

做了一点习题,代码如下

create table result
(
    id int primary key comment '标识列',
    studentno varchar(20) not null comment '学号',
    subjectid int not null comment '课程编号',
    studentresult float(6,2) not null check(studentresult>=0 && studentresult <=100) comment '考试成绩',
    examdate datetime not null comment '非空'
)comment '成绩表';

-- 表已创建添加字段的主键约束
alter table grade add primary key(gradeid);

-- 为表中字段添加外键约束时,需要注意父表中的对应字段是否为主键
-- restrict表示删除和更新行为
alter table subject add constraint subject_grade foreign key(gradeid) references grade(gradeid)
on update restrict on delete restrict;


-- 为student表中gradeid字段设置外键约束
alter table student add constraint student_grade foreign key(gradeid) references grade(gradeid)
on update restrict on delete restrict;

-- 查看student表结构
desc student;

-- 修改student表中字段名
alter table student change studentid studentno varchar(20) not null comment '学号';

-- 查看subject表结构
desc subject;

-- 为result表中studentno字段和subjectid字段设置外键约束
-- constraint关键字可以省略,如果省略系统会自动为外键命名
alter table result
    add constraint res_stu foreign key(studentno) references student(studentno)
    on update restrict on delete restrict;
alter table result
    add constraint res_sub foreign key(subjectid) references subject(subjectid)
    on update restrict on delete restrict;

-- 查看result表结构
desc result;

-- 创建图书馆管理系统数据库
create database librarydb;

-- 使用指定数据库
use librarydb;

-- 查看当前数据库
select database();

-- 创建图书信息表
create table book
(
    -- 利用检查约束check+占位符like实现固定字符开头
    bid varchar(50) primary key check(bid like 'ISBN%') comment '图书编号',
    bname varchar(50) not null comment '图书名称',
    author varchar(50) comment '作者姓名',
    pubcomp varchar(50) comment '出版社',
    -- 利用检查约束check+获取当前日期函数curdate()达到目标效果
    pubdate date check(pubdate between '0000-0-0' and '2025-0-0') comment '出版日期',
    bcount int check(bcount>=1) comment '现存数量',
    price decimal(8,4) check(price>0) comment '货币'
)comment '图书信息表';

-- 查看book表结构
desc book;

四.英语单词:日常花了一个半小时复习了一个章节的英语单词

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐