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

第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>中

  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<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 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值