练习进度
3.36
bool isArrSame(int arr1[], int arr2[]) {
unsigned int size1 = sizeof(arr1), size2 = sizeof(arr2);
if (size1 != size2) return false;
int* p1(arr1),*p2(arr2),*p1e=p1+size1,*p2e=p2+size2;
while (p1 != p1e && p2 != p2e)
{
if (*p1 != *p2) return false;
++p1;
++p2;
}
return true;
}
bool isVecSame(vector<int> vec1, vector<int> vec2) {
if (vec1.size() != vec2.size()) return false;
for (int i = 0; i < vec1.size(); i++)
{
if (vec1[i] != vec2[i]) return false;
}
return true;
}
3.43
int ia[3][4] = { 0,1,2,3,4,5,6,7,8,9,10,11 };
//1. for语句管理迭代过程
for (int(&row)[4] : ia)
{
for (int& col : row)
cout << col << " ";
cout << endl;
}
//2. 下标运算符
for (int i=0;i<3;++i)
{
for (int j=0;j<4;++j)
cout << ia[i][j] << " ";
cout << endl;
}
//3. 指针
for (int(*p)[4] = ia; p != ia + 3; ++p)
{
for (int* q = *p; q != *p + 4; ++q)
cout << *q << " ";
cout << endl;
}
4.10
int num;
while(cin<<num&&num!=42)
知识点记录
数组
字符数组的初始化
与vector不同,不能直接用一个数组初始化另一个数组。
- 数组下标的类型:size_t,无符号数,定义在cstddef头文件
定义数组的指针和引用:
int arr[10];
int (*p_arr)[10] = &arr; //指针p_arr指向一个含有10个整数的数组arr
int (&ref_arr)[10] = arr; //引用ref_arr引用一个含有10个整数的数组arr
int *ptrs[lO]; //含有10个整形指针的数组
int *(&arry) [10] = ptrs; //arry是数组的引用,该数组含有10个指针
指针和数组
在大多数表达式中,使用数组类型的对象其实是使用一个指向该数组首元素的指针。
- 用数组作为auto变量的初始值,得到的类型是指针。
- 用数组作为decltype变量的初始值,得到的类型还是同样大小的数组
int ia [] = {0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9} ; //ia是一个含有10 个整数的数组
auto ia2(ia); // ia2是一个整型指针,指向ia的第一个元素
auto ia2(&ia[0]); //等价于上一句
decltype(ia) ia3 = {0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9};
利用指针输出数组元素:
int arr[]={1,2,3,4,5,6,7,8,9,0};
int *e=&arr[10]; //尾后指针
for(int *b=arr;b!=e;++b)
cout<<*b<<endl; //输出arr的元素
begin(),end()函数:获取数组的头指针和尾后指针
int arr[]={1,2,3,4,5,6,7,8,9,0};
int *b=begin(arr); //头指针
int *e=end(arr); //尾后指针
while(b!=e)
{
cout<<*b<<endl; //输出arr的元素
++b;
}
只要两个指针指向同一个数组的元素, 或者指向该数组的尾元素的下一位置, 就能利用关系运算符对其进行比较。
- 指针之差的类型:ptrdiff_t,有符号数,定义在cstddef头文件
C风格字符串的函数
不能直接用string给字符数组赋值,可以使用string类中的函数c_str()。函数返回值是一个C风格的字符串(也是一个指针)
string s="Good day today!";
const char *str=s.c_str();
用数组给vector初始化:
int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
vector<int> vec1(begin(arr), end(arr)); //完全相同的初始化
vector<int> subvec(arr+1,arr+4); //部分初始化,取arr[1]-arr[3],
//注意不包括arr[4]!!!
表达式
关于左值和右值:
- 当一个对象被用作右值的时候,用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份(在内存中的位置)。
运算符
赋值运算符的左侧运算对象一定是个可修改的左值。
注意:初始化不是赋值!
赋值运算符满足右结合律:
int ival,jval;
ival=jval=0; //先把0赋给jval,再把jval赋给ival
赋值运算符的优先级低于其他运算符。
++ –
前置版本的递增运算符避免了不必要的工作,它把值加1 后直接返回改变了的运算对象。与之相比,后置版本需要将原始值存储下来以便于返回这个未修改的内容。如果我们不需要修改前的值,那么后置版本的操作就是一种浪费。