1.getline在最后读取换行符,但是不存储换行符。与gets相同。
fgets读取换行符也存储换行符。
cin不读取换行符(更不存储),遇到开头是空白字符会自动跳过。
2.auto len = string.size();
auto的类型为string::size_type
3.大多数情况下,{}是列表初始化。
()是指定大小。
4.范围for语句(for (auto i : str)),使用了下标和迭代器都不应该改变遍历序列的大小
5.养成使用迭代器!=而非<的习惯。
6.迭代器类型
vector::iterator it;
vector::const_interator it;
调用begin,end时,主要看指向的类型
const vector 或 vector
cbegin,cend返回都是vector::const_interator
7.默认初始化与列表初始化是不同的。
int a[5] = {1,2,3} 会自动把剩余的值初始化为0
vectora(5);也会初始化为0;
int a[5];是默认初始化,此时值不确定。
8.int *ptrs[10]; 容量为10的指针数组
int &ref[10]; 不存在
int (*ptrs)[10]; 指向容量为10的数组的指针
int (&arr)[10]; 引用容量为10的数组
int *(&arr)[10];引用容量为10的指针数组
从内往外读,从右向左读。
9.unsigned buf_size = 1024;
(a) int ia[buf_size];
(b) int ia[4 * 7 - 14];
© int ia[txt_size()];
(d) char st[11] = “fundamental”;
数组的下标只能是常量表达式(常量表达式并不是常量的表达式,而是编译时确定能得到的值。如const int a = 2;4*7 - 14;返回常量表达式的constexpr函数(constexpr不一定返回常量表达式))
10.int add(int arr1[2], int arr2[3]);
这种方式声明的函数 add 将接受两个分别包含 2 个和 3 个整数的数组作为参数。然而,实际上,C/C++ 中传递数组时总是以指针的形式进行传递,因此这里的参数实际上是 int* arr1 和 int* arr2。
11.将string转化成char
string a(“123”);
char *b = new char[a.size()];
strncpy(b,a.c_str(),a.size());
12.用数组初始化vector容器
int a[3] = {1,2,3};
vectorb(a.begin(),b.end());
难以理解:
int ia[2][3]
for(auto p = begin(ia);p != end(ia);p++)
for(auto q = begin(*p);q != end(*p);q++)
cout<<*q<<’ ’
cout<<endl;
理解的关键:数组的数组。当右值为ia时,指的是ia第一个元素的地址。
只有取址的时候对类型要求比较严格,例如只能int (*a)[3] = ia;
但是解址的时候a[0][0]或者(*a)[0]或者**a(只能控制最外面一层)都可以。