-
在使用模板的时候要看情况,判断传值进去,还是传地址进去,两者会产生两种完全不同的效果。—用自己实现的优先队列实现Dijkstra算法时被坑后的心得。
-
在处理长度不确定的字符串的时候尽量使用字符串,而不要着急使用动态数组。
-
realloc函数可以重新分配空间大小,而不改变当下空间存储的数据。适用于已经分配好内存空间,而传递内存开始位置给函数的情况。示例如下:
-
vector有一个reverse_iterator,可以实现vector的逆序遍历,示例如下:
-
链表要删除多个数据的时候一定要注意:
- 如果你删除了当前这个节点
curNode
,那么上一个节点preNode
的nex
t指针就指向了该节点next
指针指向的元素,即preNode->next = curNode->next
。如果只删除一个元素,那么此时你就完事了,如果你还要继续在这个链表中查找符合条件的元素,继续删除,那么你要注意了:你需要记录当前元素,如果你下一次处理的元素也要被删除,那么就需要让这次处理的元素的指针指向下一次处理的元素的next指针。所以你记录的preNode应该是之前哪个节点,不需要变化。说的我自己都晕了,还是上代码吧,比较清晰。
- 如果你删除了当前这个节点
链表定义如下:
class ListNode {
public:
int val;
ListNode* next;
ListNode(int val){
this->val=val;
this->next=NULL;
};
};
删除多个元素的函数如下,删除链表中大于m的元素:
ListNode* partition(ListNode* head,int m) {
ListNode* tmp = head;
ListNode* newhead = NULL;
ListNode* newList = NULL;
ListNode* pre = head;
while(tmp != NULL)
{
if(tmp->val > m)
{
if(tmp == head)
{
head = tmp->next;//这里还没有确定head是否通过过滤,但需要把它先记录下来
pre = head;
}
else
{
pre->next = tmp->next;//这里没有挪动
}
}
else//如果不需要删除元素,那么才需要将pre向前挪动,否则不需要挪动
{
pre = tmp;
}
tmp = tmp-> next;
}
return head;
}
- 对于一些看似非常繁琐的问题,首先找出它的上下界,然后使用二分或者其它方法慢慢去逼近它。
- 构造函数不可以显示调用,析构函数可以显示调用。
- 静态变量既可以是基本数据类型,也可以是类或者结构体。