第4章 数组、vector和字符串
第1节 数组
注意事项数组的复杂声明数组中元素的访问数组到指针的隐式转换获得s指向数组开头和结尾的指针数组的其他操作C字符串多维数组 第2节 vector
构造和初始化元素的索引和遍历迭代器iteratorvector相关其他内容 第3节 string
第4章 数组、vector和字符串 第1节 数组将一个到多个相同类型的对象串联到一起,所组成的类型
int a ; int b[10]; 区分类型,b的类型为int[10]初始化方式
缺省初始化int a[3] = {1,2}; //第三个元素为0int b[] = {1,2,3} //int[3] 注意事项
不能使用auto声明数组类型
数组不支持复制
数组的长度必须为一个常量表达式
字符串的数组特殊性 (在字符串结尾隐式加上 表示结束)
char str[] = "Hello"; //char[6]
char srt[] = {'H','e','l','l','o'}; //char[5]
数组的复杂声明
指针数组与数组的指针
int x1,x2,x3; //指针数组
int* a[3] = {&x1, &x2, &x3}; //a类型为int*[3]
int a[3] = {1, 2, 3}; //数组的指针
int (*b)[3] = &a; //b类型为int(*)[3]
声明数组的引用
int a[3] = {1, 2, 3};
int (&b)[3] = a;
数组中元素的访问
数组对象是一个左值(l-value)
(左值:能够放在等号左侧的值(C),C++中 locater-value)
使用时会转换成相应的指针类型x[y]; // 会被解析成*(x+y) 数组到指针的隐式转换
通常会产生转换
隐式转换会丢失一部分信息
int a[3] = {1,2,3}; //a int[3]
auto b = a; //b int*
可以通过声明引用来避免隐式转换
int a[3] = {1,2,3}; //a int[3]
auto b = a; //b int*
auto& c = a; //c int(&)[3]
不能使用extern指针来声明数组
获得s指向数组开头和结尾的指针int a[3] = {1, 2, 3};
a;
&(a[0]); //开头指针
std::begin(a); // int*
std::cbegin(a); // const int*
a+3;
&(a[3]); //结尾指针
std::end(a);
std::cend(a); //end和cend指向数组最后一个元素的下一个元素
数组的其他操作
求元素个数
sizeof 对象的字节数(C语言常用)sizeof(a)/sizeof(int)
std::size(a); (推荐方法)
std::cend(a) - std::cbegin(a); 运行期操作 (编译器可以解决,不推荐)
数组的遍历
int a[3] = {1,2,3};
size_t index = 0;
while(index < std::size(a)){
index = index + 1;
}
int a[3] = {1,2,3};
auto ptr = std::cbegin(a);
while(ptr != std::cend(a)){
ptr = ptr + 1;
}
for(int x:a){
//语法塘 c++insight可以查看 简化书写 C++11开始
}
C字符串
字符串本质上也是数组
char str[] = "Hello"; //char[6] null-terminated string
auto ptr = str; //char*
隐式转化为指针类型,对字符串进行操作时寻找' '代表字符串结束
返回字符串长度
#include多维数组strlen(a);
本质:数组的数组
int a[3][4];
聚合初始化
int a[][4] = {{1,2,3},{4,5,6,7}};
多维数组的索引和遍历
int x[3][4] = {1,2,3,4,5};
for(auto& p:x){
for(auto q:p){
std::cout<< q <<' ';
}
}
指针与多维数组
第2节 vectorC++标准库中定义的类模板
std::vector
与内建数组相比,更侧重于易用性(性能差于内建数组)
可复制、可在运行期动态改变个数 构造和初始化
聚合初始化 std::vector 其他方法 获取元素个数,判断是否为空 插入、删除元素 vector的比较 []v.s.at at在索引超出时会报错,更加安全 begin/end函数 v.s. begin/end方法 模拟指针的行为包含多种类别,每种类别支持的操作不同vector对应随机访问迭代器
解引用与下标访问 (*x) y[1]移动两个迭代器相减求距离两个迭代器比较
vector相关其他内容
添加元素可能使迭代器失效 多维vector 从.到-> C++标准库中定义的类模板,用于内建字符串的代替品 std::string是std::basic_string 与内建字符串相比,更侧重于易用性 可复制、在运行期动态改变字符串的个数
构造与初始化 其他方法 尺寸相关(size,empty)比较赋值拼接 (直接加)索引 str[2]转换为C字符串
auto ptr = str.c_str(); //返回一个char*类型的指针,指向null-terminated的字符数组的首元素地址std::vector
a.push_back(2); //结尾插入一个元素2
a.pop_back(); //从结尾删除一个元素
auto x = a.begin();
auto y = a.end(); //返回一个iterator
迭代器iterator
std::vector
std::vector
第3节 string
#include



