[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。
- 二级指针容易出错的地方:

使用未初始化的二级指针:
int**p;int* p1=&b;*p=p1;//运行时将崩溃,因为p没有初始化,此时对p解引用将是访问未初始化的内存的coredumpp=&p1;//正确的做法像这样!
关于二级指针赋值引发的小事故:
前缀树::insert
void insert(string word) {if(word.empty()){return;}Node* cur=root;for(auto c:word){cur=cur->dict[c-'a'];if(cur==nullptr){cur=new Node();}cur->paths++;}cur->ends++;}
这里有指针赋值上的错误:
第五行cur是一个局部的指针,第七行cur指向了新的地址newAdr,第九行仍然是给cur申请一块新地址,而不是给newAdr申请的,所以这是无法构造前缀树的。
这时应用二级指针管理地址:
void insert(string word) {if(word.empty()){return;}Node** cur=&root;for(auto c:word){*cur=(*cur)->dict[c-'a'];if((*cur)==nullptr){(*cur)=new Node();}(*cur)->paths++;}(*cur)->ends++;}
不料扔发生了指针引用错误:
第五行cur是一个二级指针,指向root指针的地址,第七行赋值其实是改变了root的指向,*cur仍然是root,所以在第九行仍然是给root申请的新地址,而非给root的dict[i]申请。
二级指针上面讲了正确的初始化,下面是正确的赋值方式:(第七行)
void insert(string word) {if(word.empty()){return;}Node** cur=&root;for(auto c:word){cur=&((*cur)->dict[c-'a']);//正确初始化if((*cur)==nullptr){(*cur)=new Node();}(*cur)->paths++;}(*cur)->ends++;}
[x] 关于memcpy理解的误区:
void fun(int *c){int b=10;memcpy(c, &b, sizeof(int));//请问这里会改变外部变量的值吗?}int a=1;fun(&a);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);
