《C++ Primer》 读书笔记第3章——字符串、vector、迭代器和数组

string:
★不要在头文件中使用using namespace std
★getline中不会存入换行符,但会在遇到换行符结束
★string的size()函数返回值是size_type类型,无符号的
所以如果size()<-5, 则-5被转换成无符号,则是一个很大的数字
★“abc”+"def"是错的, string类型的 s + “def”是对的
★cctype头文件中有一堆函数,能够判断一个字符是什么,这样判断大写时,不需要自己写什么>=A && <=Z这么麻烦的判断,    is__
★范围for , 即 for(变量: 序列),  则变量就是改序列中的每1个, 这样想遍历string时,只需要 for(auto c:str)即可遍历str
若要修改str中的东西,则用for(auto &c:str),这样c就能改变str中的东西了


vector:
★实例化:根据模板来创建类或函数
★vector的初始化:
vectorv1{1,2,3}  (列表初始化,也可以加个等号)
vector v2(n,data)
                     v3(v2)
当vector v(10)时,则构建10个int,且进行“值初始化”。 int会被初始化为0
用数组初始化vector:  vector  v(begin(num), end(num));
也可以是  vector  v(num+1,  num+3),,  则初始化为num[1]到num[2]
如果有些类的构造函数有参数,则这种初始化方式是错误的。
★vector  v{10},  注意10不是字符串, 则此时等同于vector v(10)
★vector::size_type是对的, vector::size_type是错的,因为vector必须实例化才有效


迭代器:
★迭代器v.end()指向的是v尾元素的下一个位置
★有时候迭代器类型写不来,那么就 auto it = v.begin()即可
★只读迭代器:  vector::const_iterator it3,  则it3只能读,不能写
什么时候v.begin()会返回只读迭代器?
即定义了const vector v 的时候
★ 想要调用it迭代器里的函数,应该是(*it).func(), 而不是*it.func()
想要简化的话,那就用 it->func()
★凡是使用了迭代器的循环体,都不要往其中添加元素:
    例如你用for循环,里面有v.begin和v.end,你如果执行了v.push_back,那么就GG了
★迭代器之间的 大小比较,所比较的是他们的位置。
迭代器相减, 得到的是距离,其类型时difference_type
获得中间元素:  auto mid = v.begin() + (v.end()-v.begin())/2 , 可用于二分


数组
★什么时候数组初始化时,其纬度可以用变量? 例如int num[numsize]??
那么numsize必须是常量表达式,即constexpr
★数组类型不可以用auto。
★初始化列表可以小于维度,则剩余的元素被初始化为默认值
但其列表不可以大于维度
★char a4[3]="abc"是错误的,因为还有一个'\0'
★ int &refs[10] = arr是错的,没有引用的数组
但是可以 int (&refs)[10] = arr, 则refs引用一个10个元素的数组
类似于  int (*refs)[10] = arr,  refs是指针,指向10个元素的arr
int *(&refs)[10] = parr,  则refs是数组的引用, 这个数组含有10个指针,就像 int (&refs)*[10]
★数组也可以用范围for, 即for(auto i : scores)
★decltype(某数组),  则类型是相同数量的数组,而非指针
★C++11引入了begin函数和end函数, 可以有
*startp = begin(数组)
*endp = end(数组)  则得到对应的指针
但是切记,尾后指针不能拿来解引用或者递增

指针:
★指针相减,得到的类型时ptrdiff_t
★指针的[]下标可以为负,  即 int *p = &a[2],  则可以有p[-2]表示a[0]
★string的c_str()功能不稳定,如果s变化它返回的指针也会变化。 最好用const char *str = s.c_str() ,或者重新拷贝一下再赋值给str

多维数组:
★多维数组的范围for要注意,   
for(auto  row : ia)
  for(auto col:row)  是错的, 因为row:ia时,row将变成指针,则第二层循环就错了
应该写成   for(auto &row:ia)
                    for(auto col:row),   则row一定是数组

★ia是二维数组,
则for(auto p = ia; p != ia+3; p++),//这里的p是一个指针,指向一维数组 
     for(auto q = (*p);q!=*p+4;q++)   //这里要注意!  不是*(p+4)而是*p+4, 即*p是第一个一维数组首地址,+4则是该数组的末地址

你可能感兴趣的:(读书笔记,C/C++基础)