文章目录
第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 <vector>
using namespace std;
相关方法
vector<int> 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
字符串的指针表示
指针所指的区域能否改变取决于指针指向的那块区域是否为可变的,如若指向的为常量,则不可变,而若指向的区域为变量,那么可以改变
字符串数组数组名定义了之后就不可变,但是数组里的值可变,而定义一个指针,指针变量的值是可变的,但是若其指向的为常量,那么则指针指向的字符串的值不可变
字符串的基本操作
包含在头文件<string.h>中
-
字符串长度:strlen(s)
返回字符串s的长度(s的长度不包括 ’ \0 ')
区别sizeof(),sizeof()计算的为占用的空间,strlen()计算的为字符串长度
-
字符串比较:strcmp(s1, s2)
若s1和s2 是相同的,则返回0;
若s1 < s2 则返回值小于0;
若s1 > s2 则返回值大于0
-
字符串拷贝:strcpy(s1, s2)
复制字符串s2到字符串s1
-
复制指定长度字符串:strncpy(s1, s2, n)
将字符串s2中前n个字符串拷贝到s1中
-
字符串拼接:strcat(s1, s2)
将字符串s2拼接到s1之后
-
查找字符串:strchr(s1, ch)
指向字符串s1中字符ch的第一次出现的位置
-
查找字符串:strstr(s1, s2)
指向字符串s1中字符串s2的第一次出现的位置
进行底层操作时,为避免编译器错误发出报错,可添加宏:_CRT_SECURE_NO_WARNINGS
缓冲区溢出问题
举例:在进行字符串拼接的操作时,若拼接长度过大而超出原本的长度,那么就有可能把存储区原本存储的信息改变,造成逻辑的改变
解决方法:养成进行边界判断的习惯,另外也存在更安全的API可供调用,如strcpy()更为安全的版本为strcpy_s(),其他几个字符串操作函数的安全版本均为*_s(),例如strcat_s(s1, size, s2,),当s2的长度大于size时,那么会报错,无法运行
string简介
#include<string>
using namespace std;
//定义字符串变量
string s;//定义空字符串
string s = "helloworld";//定义并初始化
string s ( "helloworld" );
string s = string( "helloworld" );
字符串相关函数:
-
获取字符串的长度
s.length()//字符串长度 s.size()//同上 s.capacity()//字符串s所占空间大小
-
字符串比较:= = ! = > > = < < =
string s1 = "hello", s2 = "world"; cout << (s1 == s2) << endl;//返回0 cout << (s1 != s2) << endl;//返回1
字符串的常用操作:
//转换为C风格的字符串
const char *c_str1