2022.4.11
1.substr()函数-用于子符串的截取
两个参数用法:
字符串.substr(参数1,参数2)
参数1:(可以是0、正整数、负数)
-
如果是0或正整数,则代表字符串截取的起始下标
-
如果是负数,则代表从倒数第几个字符开始截取
参数2:
-
字符串截取字符的个数(正整数)
-
如果是0或负数,则会返回空字符串
1个参数用法:
字符串.substr(参数);
参数:
- 如果是0或正整数:字符串截取的起始下标,默认截取至字符串结尾
- 如果是负数:则从倒数第几个字符开始截取,默认截取至字符串结尾
2.stoi()函数
将n进制的字符串转化为十进制
stoi(字符串,起始位置,几进制)
4.15
1.vector容器
vector 是向量类型,它可以容纳许多类型的数据,如若干个整数,所以称其为容器。vector 是C++ STL的一个重要成员,使用它时需要包含头文件:
#include<vector>;
一、vector 的初始化:可以有五种方式,举例说明如下:
(1) vector<int> a(10); //定义了10个整型元素的向量(尖括号中为元素类型名,它可以是任何合法的数据类型),但没有给出初值,其值是不确定的。 (2)vector<int> a(10,1); //定义了10个整型元素的向量,且给出每个元素的初值为1 (3)vector<int> a(b); //用b向量来创建a向量,整体复制性赋值 (4)vector<int> a(b.begin(),b.begin+3); //定义了a值为b中第0个到第2个(共3个)元素 (5)int b[7]={1,2,3,4,5,9,8}; vector<int> a(b,b+7); //从数组中获得初值
二、vector对象的几个重要操作,举例说明如下:
(1)a.assign(b.begin(), b.begin()+3); //b为向量,将b的0~2个元素构成的向量赋给a (2)a.assign(4,2); //是a只含4个元素,且每个元素为2 (3)a.back(); //返回a的最后一个元素 (4)a.front(); //返回a的第一个元素 (5)a[i]; //返回a的第i个元素,当且仅当a[i]存在2013-12-07 (6)a.clear(); //清空a中的元素 (7)a.empty(); //判断a是否为空,空则返回ture,不空则返回false (8)a.pop_back(); //删除a向量的最后一个元素 (9)a.erase(a.begin()+1,a.begin()+3); //删除a中第1个(从第0个算起)到第2个元素,也就是说删除的元素从a.begin()+1算起(包括它)一直到a.begin()+3(不包括它) (10)a.push_back(5); //在a的最后一个向量后插入一个元素,其值为5 (11)a.insert(a.begin()+1,5); //在a的第1个元素(从第0个算起)的位置插入数值5,如a为1,2,3,4,插入元素后为1,5,2,3,4 (12)a.insert(a.begin()+1,3,5); //在a的第1个元素(从第0个算起)的位置插入3个数,其值都为5 (13)a.insert(a.begin()+1,b+3,b+6); //b为数组,在a的第1个元素(从第0个算起)的位置插入b的第3个元素到第5个元素(不包括b+6),如b为1,2,3,4,5,9,8 ,插入元素后为1,4,5,9,2,3,4,5,9,8 (14)a.size(); //返回a中元素的个数; (15)a.capacity(); //返回a在内存中总共可以容纳的元素个数 (16)a.resize(10); //将a的现有元素个数调至10个,多则删,少则补,其值随机 (17)a.resize(10,2); //将a的现有元素个数调至10个,多则删,少则补,其值为2 (18)a.reserve(100); //将a的容量(capacity)扩充至100,也就是说现在测试a.capacity();的时候返回值是100.这种操作只有在需要给a添加大量数据的时候才显得有意义,因为这将避免内存多次容量扩充操作(当a的容量不足时电脑会自动扩容,当然这必然降低性能) (19)a.swap(b); //b为向量,将a中的元素和b中的元素进行整体性交换 (20)a==b; //b为向量,向量的比较操作还有!=,>=,<=,>,<
2023/5/15补充:
1、两个vector拼接:v1.insert(v1.end(),v2.begin(),v2.end());
2、查找vector中有无某元素:if(std::find(v.begin(),v.end(),key)!=v.end())
4.30
1.C++ 对类型转换进行了分类,并新增了四个关键字来予以支持,它们分别是:
关键字 | 说明 |
---|---|
static_cast | 用于良性转换,一般不会导致意外发生,风险很低。 |
const_cast | 用于 const 与非 const、volatile 与非 volatile 之间的转换。 |
reinterpret_cast | 高度危险的转换,这种转换仅仅是对二进制位的重新解释,不会借助已有的转换规则对数据进行调整,但是可以实现最灵活的 C++ 类型转换。 |
dynamic_cast | 借助 RTTI,用于类型安全的向下转型(Downcasting)。 |
这四个关键字的语法格式都是一样的,具体为:
xxx_cast<newType>(data)
newType 是要转换成的新类型,data 是被转换的数据。例如,老式的C风格的 double 转 int 的写法为:
- double scores = 95.5;
- int n = (int)scores;
C++ 新风格的写法为:
- double scores = 95.5;
- int n = static_cast<int>(scores);
static_cast 关键字
static_cast 只能用于良性转换,这样的转换风险较低,一般不会发生什么意外,例如:
- 原有的自动类型转换,例如 short 转 int、int 转 double、const 转非 const、向上转型等;
- void 指针和具体类型指针之间的转换,例如
void *
转int *
、char *
转void *
等; - 有转换构造函数或者类型转换函数的类与其它类型之间的转换,例如 double 转 Complex(调用转换构造函数)、Complex 转 double(调用类型转换函数)。
需要注意的是,static_cast 不能用于无关类型之间的转换,因为这些转换都是有风险的,例如:
- 两个具体类型指针之间的转换,例如
int *
转double *
、Student *
转int *
等。不同类型的数据存储格式不一样,长度也不一样,用 A 类型的指针指向 B 类型的数据后,会按照 A 类型的方式来处理数据:如果是读取操作,可能会得到一堆没有意义的值;如果是写入操作,可能会使 B 类型的数据遭到破坏,当再次以 B 类型的方式读取数据时会得到一堆没有意义的值。 - int 和指针之间的转换。将一个具体的地址赋值给指针变量是非常危险的,因为该地址上的内存可能没有分配,也可能没有读写权限,恰好是可用内存反而是小概率事件。
static_cast 也不能用来去掉表达式的 const 修饰和 volatile 修饰。换句话说,不能将 const/volatile 类型转换为非 const/volatile 类型。
static_cast 是“静态转换”的意思,也就是在编译期间转换,转换失败的话会抛出一个编译错误。
2022.7.7
_findfirst & _findnext
一、这两个函数均在io.h里面。
二、首先了解一下一个文件结构体:
struct _finddata_t {
unsigned attrib;
time_t time_create;
time_t time_access;
time_t time_write;
_fsize_t size;
char name[260];
};
time_t,其实就是long
而_fsize_t,就是unsigned long
现在来解释一下结构体的数据成员吧。
attrib,就是所查找文件的属性:_A_ARCH(存档)、_A_HIDDEN(隐藏)、_A_NORMAL(正常)、_A_RDONLY(只读)、 _A_SUBDIR(文件夹)、_A_SYSTEM(系统)。
time_create、time_access和time_write分别是创建文件的时间、最后一次访问文件的时间和文件最后被修改的时间。
size:文件大小
name:文件名。
三、用 _findfirst 和 _findnext 查找文件
1、_findfirst函数:long _findfirst(const char *, struct _finddata_t *);
第一个参数为文件名,可以用"*.*"来查找所有文件,也可以用"*.cpp"来查找.cpp文件。第二个参数是_finddata_t结构体指针。若查找成功,返回文件句柄,若失败,返回-1。
2、_findnext函数:int _findnext(long, struct _finddata_t *);
第一个参数为文件句柄,第二个参数同样为_finddata_t结构体指针。若查找成功,返回0,失败返回-1。
3、_findclose()函数:int _findclose(long);
只有一个参数,文件句柄。若关闭成功返回0,失败返回-1。