[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解引用将是访问未初始化的内存的coredump
p=&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);