• [x] distance返回两个迭代器之间的距离,比如

      vector arr={0,1,2,3}; auto i=arr.begin(); auto j=prev(arr.end()); cout<< distance(i,j); 这里输出[0,3]之前的距离,答案是3,所以长度是distance(i,j)+1。

    • [x] 拷贝函数原型:

      memcpy(char dst, char src, size_t len); strcpy(char dst, char src, size_t len); std::copy(InputIterator first, InputIterator last, OutputIterator result);

    • [x] 比较函数规则:

      标准库自带的strcmp,compare: if a<b: return -1; else if a==b: return 0; else return 1;

    • [x] 容器的reserve的使用风险:reserve并不会改变容器的size,但增加了vector的capacity。建议使用resize。


    • 二级指针容易出错的地方:

    image.png
    使用未初始化的二级指针:

    1. int**p;
    2. int* p1=&b;
    3. *p=p1;//运行时将崩溃,因为p没有初始化,此时对p解引用将是访问未初始化的内存的coredump
    4. p=&p1;//正确的做法像这样!

    关于二级指针赋值引发的小事故:
    前缀树::insert

    1. void insert(string word) {
    2. if(word.empty()){
    3. return;
    4. }
    5. Node* cur=root;
    6. for(auto c:word){
    7. cur=cur->dict[c-'a'];
    8. if(cur==nullptr){
    9. cur=new Node();
    10. }
    11. cur->paths++;
    12. }
    13. cur->ends++;
    14. }

    这里有指针赋值上的错误:

    第五行cur是一个局部的指针,第七行cur指向了新的地址newAdr,第九行仍然是给cur申请一块新地址,而不是给newAdr申请的,所以这是无法构造前缀树的。

    这时应用二级指针管理地址:

    1. void insert(string word) {
    2. if(word.empty()){
    3. return;
    4. }
    5. Node** cur=&root;
    6. for(auto c:word){
    7. *cur=(*cur)->dict[c-'a'];
    8. if((*cur)==nullptr){
    9. (*cur)=new Node();
    10. }
    11. (*cur)->paths++;
    12. }
    13. (*cur)->ends++;
    14. }

    不料扔发生了指针引用错误:

    第五行cur是一个二级指针,指向root指针的地址,第七行赋值其实是改变了root的指向,*cur仍然是root,所以在第九行仍然是给root申请的新地址,而非给root的dict[i]申请。

    二级指针上面讲了正确的初始化,下面是正确的赋值方式:(第七行)

    1. void insert(string word) {
    2. if(word.empty()){
    3. return;
    4. }
    5. Node** cur=&root;
    6. for(auto c:word){
    7. cur=&((*cur)->dict[c-'a']);//正确初始化
    8. if((*cur)==nullptr){
    9. (*cur)=new Node();
    10. }
    11. (*cur)->paths++;
    12. }
    13. (*cur)->ends++;
    14. }

    • [x] 关于memcpy理解的误区:

      1. void fun(int *c)
      2. {
      3. int b=10;
      4. memcpy(c, &b, sizeof(int));//请问这里会改变外部变量的值吗?
      5. }
      6. int a=1;
      7. fun(&a);
      8. printf("%d\n,a);

      答案是会

      memcpy(c, &b, sizeof(int));//因为就等价于*c=b;
      
    • [x] ++i和i++的注意点

    在条件表达式中

    while(s[i++]=='0');
    //或
    if(s[i++]=='0');
    

    i无论如何都会自增1,很容易忽略如同

    do{
        i++;
    }while(false);