1.string
string是一种库函数。
定义和初始化string对象
string s1; //默认初始化,s1是空字符串
string s2 = s1 //s2是s1的副本
string s3 ("value") //s3是字面值“value”的副本,除了字面值最后的那个空字符外
string s3 = "value"//等价于上式
string s4(n,'c')//初始化n个c
直接初始化和拷贝初始化
string s5 ="dong"//拷贝初始化
string s6("dong")//直接初始化
string s7(10,'d')//直接初始化
2.vector
vector对象能够高效增长,在定义vector对象时,没有必要设定其大小(事实上这么做性能会更差)。
vector<int> tes;
tes.push_back(t);
v.empty();
v.size();
3.数组
数组是一种类似于标准库vector的数据结构,但在性能和灵活性权衡上与vector有所不同,通过对象所在位置进行访问。
数组声明a[d],a是数组的名字,d是数组的维度,维度必须是一个常量表达式(指不会改变且在编译阶段就知道结果的表达式)
unsigned cnt = 42 //不是常量表达式
constexptr unsigned sz = 42;//常量表达式
int arr[10] //含有10个整数的数组
int *arr[10] //含有10个整型指针的数组
复杂数组声明
int *ptr[10];
int &refs[10] = ?//错误,不存在引用的数组
int (*ptr)[10] = &arr;// ptr指向一个含有10个整数的数组
int (&arrRef)[10] = arr ;//arrRef引用一个含有10个整数的数组
字符数组的特殊性:
除了显示初始化数组外,还可以用字符串字面值对此类数组初始化。
当采用这种方式时,需注意字符串尾还有一个空字符,这个空字符也会被拷贝进数组中。
char a2[] = {'c','+','+','\0'};//维度为4
char a3[] = "c++";//维度为4
cinst char a4[6] = "daniel";//错误,没有空间放空字符
相较于 vector,数组的大小在定义时就固定,不能随意向数组中增加元素。
指针和数组:
使用数组时,编译器一般会把它转换成指针。
string *p = &nums[0];
//等价于
string *p = nums;
4.多维数组
多维数组是数组的数组。
注意:
for(const auto &row : ia)//对于外层数组的每一个元素
for(auto col : row)//对于内层数组的每一个元素
cout << col << endl;
将外层循环控制变量声明成引用,避免数组被自动转成指针。
for(auto row : ia)
for(auto col : row)
此时程序无法编译通过,编译器在初始化row时会自动将数组形式的元素转化成指向该数组内的首元素的指针,这会使row的类型变成int* ,内层循环不合法。