c++ primer 第三章查漏补缺

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(只能控制最外面一层)都可以。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值