- c风格字符串:字符串字面值,书写的字符串存放在数组中,并以’\0’结束;如:
char a[] = {'c','+','+','\0'};//显示添加'\0';维度为4
char b[] = "c++";//自动添加 '0';维度为4
char c[] = {'c','+','+'};//维度为3,没有'\0'
c风格字符串的函数:
1)strlen§ 返回p的长度,不包括’\0’
2)strcmp(p1,p2) 比较p1和p2的相等性,相等返回0,p1>p2返回正值,p1<p2返回负
3)strcat(p1,p2) 将p2拼接在p1后,返回
4)strcpy(p1,p2) 将p2拷贝给p1,返回
使用此类函数必须是以空字符’\0’为结束的*字符*数组。
注1:使用string类型的时候要知道其长度:使用.size()函数
strlen仅用于c风格字符串,char且有空字符。
注2:使用string类型的时候要比较使用,直接比较。s1<s2,比较c风格字符串,使用strcmp()函数。
注3:string对象 的拼接直接使用+号,c风格字符串使用strcar.
注4:string对象的拷贝是直接拷贝,s1 =s2,c风格字符串使用strcpy
值得注意的是:不管是拷贝还是拼接,都有一个数组,而该数组的大小必须能放下所有的元素,不然会产生意想不到的后果。
综上:使用string更安全
注:任何出现字符串字面值的地方都可以使用以空字符结束的字符数组来替代。
1)允许使用以空字符为结束的字符数组来初始化string对象,或为string对象赋值。
2)在string对象的+法运算中允许使用以空字符为结束的字符数组作为一个运算对象
3)在string对象的复合赋值运算中允许使用以空字符串结束的字符数组作为右侧的运算对象。
不能利用string对象直接初始化指向字符的指针,如:
string s("hello");
char *str = s;//错误,不能直接使用
const char *str =s.c_str();//正确
.c_str()函数返回的是一个指针,指针的类型是const char*
- 可以使用数组初始化vector,反之不行
int a[] = {0,1,2,3};
vector <int> v(begin(a),end(a));
-
注:应该尽量使用vector和迭代器,避免使用内置数组和指针,尽量使用string,避免使用c风格字符串。
-
多维数组:
理解:无多维数组,只有数组的数组
int a[3][4];//维度为3的数组,每个数组元素是一个含有4个整数的数组
1)多维的初始化:
int a[3][4] = {{1,2,3,4},{2,3,4,5},{3,4,5,6}};//显示初始化3行4列
int a[3][4] = {1,2,3,4,2,3,4,5,3,4,5,6};//显式初始化3行4列
int a[3][4] = {{0},{4},{8}};//初始化了每行的第一个元素,未初始化的默认为0
int a[3][4] = {1,2,3,4};//初始化第一行的4个元素,其余的默认初始化
2)下标:0为起始行列
int a[3][4];
int b[3][4][5];
a[2][3] = b[2][3][3];//确定的赋值,把b的第3行第4列第4个元素赋给a的第三行第4列
int (&r)[4] = a[1];//把a的第二行元素(含有4个)绑定到r(
3)双层for循环:
for(i=0;i<m;++i)//第一层遍历所有的行
for(j=0;j<n;j++)//第二层遍历每行下的列元素
4)使用范围for
注:使用范围for循环处理多维数组,除了最里层 的循环外,其他的都要使用引用类型:
int a[3][4];
for(auto &r :a)
for( auto c :r)//如果写成for(auto c :a)在输出的就是这12个元素的地址了
cout<<c<endl;
5)指针与多维数组:
int a[3][4];
int (*p) [4] = a;//p指向a的第一行,,所指的是一个维度为4 的数组
int *p[4] ;//p是含有4个整形指针的数组
int *(&r)[10]=ptr;//r是一个引用,引用的是一个有10个元素的数组,10个元素的类型是整形指针。
区分:整形指针的数组和指向多维数组的指针。
使用指针输出a[3][4]
int a[3][4]={1,2,3,4,2,3,4,5,3,4,5,6};
for (auto p =a;p!=a+3;++p)//注意,写成for(int *p=a;p!=a+3;p++)编译不通过
for(auto q =*p;q!=*p+4;++q)
cout<<*q<<" ";
注:p的类型是指向含有4个整数的数组的指针,q的类型是指向整数的指针。
int a[3][4]={1,2,3,4,2,3,4,5,3,4,5,6};
for( int (*p)[4] =a;p!=a+3;p++)
for( int *q =*p;q!=*p+4;q++)
cout<<*q<<" ";
使用类型别名也可以
int a[3][4]={1,2,3,4,2,3,4,5,3,4,5,6};
using int_arr = int[4];//将含有4个元素的数组指针类型命名为int_arr,
for (int_arr*g =a;g!=a+3;g++)
for( int *j =*g;j!=*g+4;j++)
cout<<*j<<" ";
使用范围for循环
int a[3][4]={1,2,3,4,2,3,4,5,3,4,5,6};
for (auto &r :a)
for (auto c:r)
cout<<c<<" ";
使用for循环:
int a[3][4]={1,2,3,4,2,3,4,5,3,4,5,6};
for( int i=0;i<3;i++)
for(int j=0;j<4;j++)
cout<<a[i][j];
使用标准库函数begin和end
int a[3][4]={1,2,3,4,2,3,4,5,3,4,5,6};
for (auto p = begin(a);p!=end(a);++p)
for(auto q = begin(*p);q!=end(*p);++q)
cout<<*q;