重学C++:笔记(二)C++基础容器&C++指针、引用

文章目录

    • 第4章 C++基础容器
      • 4.1 序列容器--数组
      • 4.2 数组的增删改查及二维数组
      • 4.3 动态数组vector
      • 4.4 字符串
    • 第5章 彻底学会 C++ 指针,引用
      • 5.1 指针的概念
      • 5.2 指针的基本操作
      • 5.3 CPP程序的存储区域划分
      • 5.4 CPP动态分配和回收原则
      • 5.5 RAII初步
      • 5.6 C++中几种变量的对比
      • 5.7 内存泄漏
      • 5.8 智能指针
      • 5.9 引用

第4章 C++基础容器

4.1 序列容器–数组

off-by-one error数组下标

off-by-one error (差一错误)

数组中通过左闭右开的方式可以避免上述错误,如:

for (int i = 0; i <10 ; i++) {
    cout << a[i] << endl;
}

数组设计的原则

从0开始,使用非对称空间:

让下界(左侧)可以取到值,让上界(右侧)取不到值;

好处:

  • 取值范围的大小:上界-下界
  • 如果取值范围为空,上界值==下界值
  • 及时取值范围为空上界值也永远不可能小于下界值

4.2 数组的增删改查及二维数组

二维数组设计的tips(循环时尽可能要满足空间局限性)

  • 在一个小的时间窗口内,访问的变量地址越接近越好,这样执行速度快
  • 一般来说,需要将最长的循环放最内层,最短的循环放在最外层,以减少CPU跨层的次数

4.3 动态数组vector

使用前的准备(引入头文件和namespace)

#include 
using namespace std;

相关方法

vector vec = {1, 2, 3};
//在尾部插入元素
vec.push_back(4);
//在中间进行元素插入
vec.insert(vec.end()-1, 4); //在尾部前一个位置插入4
//删除尾部元素
vec.pop_back();
//删除中间元素
vec.erase(vec.end()-1); //删除尾部前一个位置的元素
//获取当前容量
vec.capacity();
//获取已经存储的元素个数
vec.size();

4.4 字符串

字符串变量

  • 字符串是以空字符(’\0’)结束的字符数组
  • 空字符自动添加到字符串的内部表示中
  • 在声明字符串变量时,应该位这个空结束符预留一个额外元素的空间,如:char s [11] = {“helloworld”} ;

Unicode编码

Unicode编码:最初的目的是把世界上的文字都映射到一套字符空间中

  • UTF-8
  • UTF-16
    • UTF-16BE
    • UTF-16LE
  • UTF-32
    • UTF-32BE
    • UTF-32LE

编码错误的根本原因在于编码方式和解码方式的不统一

Windows的文件可能有BOM(byte order mark),如果要在其他平台使用,可以去掉BOM

字符串的指针表示

指针所指的区域能否改变取决于指针指向的那块区域是否为可变的,如若指向的为常量,则不可变,而若指向的区域为变量,那么可以改变

字符串数组数组名定义了之后就不可变,但是数组里的值可变,而定义一个指针,指针变量的值是可变的,但是若其指向的为常量,那么则指针指向的字符串的值不可变

字符串的基本操作

包含在头文件

  1. 字符串长度:strlen(s)

    返回字符串s的长度(s的长度不包括 ’ \0 ')

    区别sizeof(),sizeof()计算的为占用的空间,strlen()计算的为字符串长度

  2. 字符串比较:strcmp(s1, s2)

    若s1和s2 是相同的,则返回0;

    若s1 < s2 则返回值小于0;

    若s1 > s2 则返回值大于0

  3. 字符串拷贝:strcpy(s1, s2)

    复制字符串s2到字符串s1

  4. 复制指定长度字符串:strncpy(s1, s2, n)

    将字符串s2中前n个字符串拷贝到s1中

  5. 字符串拼接:strcat(s1, s2)

    将字符串s2拼接到s1之后

  6. 查找字符串:strchr(s1, ch)

    指向字符串s1中字符ch的第一次出现的位置

  7. 查找字符串:strstr(s1, s2)

    指向字符串s1中字符串s2的第一次出现的位置

进行底层操作时,为避免编译器错误发出报错,可添加宏:_CRT_SECURE_NO_WARNINGS

缓冲区溢出问题

举例:在进行字符串拼接的操作时,若拼接长度过大而超出原本的长度,那么就有可能把存储区原本存储的信息改变,造成逻辑的改变

解决方法:养成进行边界判断的习惯,另外也存在更安全的API可供调用,如strcpy()更为安全的版本为strcpy_s(),其他几个字符串操作函数的安全版本均为*_s(),例如strcat_s(s1, size, s2,),当s2的长度大于size时,那么会报错,无法运行

string简介

#include
using namespace std;

你可能感兴趣的:(C++,c++,指针,容器,内存结构,raii)