在链表中定位的时候,若本人要找第j个元素
linklist p; for(i=0;i<j;i++) p=p->next;
若本人这样写
linklist p; for(i=0;i<j/5;i++) p=p->next->next->next-next->next; for(i*=5;i<j;i++) p=p->next;
后一种写法是不是可以更快,原因是少了很多赋值。原因是总说在插入删除元素的时候,链表的遍历(要先找到插入点)较于数组的移位是很快的,但本人若不用上面所讲的后一种方法,也没见得有多快啊,
解决方案
40
你那个很简单啊,就像本人刚才说的一样,从来不判断当前节点下面还有没有节点了就一直next下去。
关于数组和链表,本人前面也说了,各有优劣,用什么视情况而定,不要想着可以用数组取代链表。数组访问是快了,但是链表灵活啊。再有就是本人遇到的情况很少有说让删除第几个节点,而是让删除满足哪些条件的节点,所以你还要遍历来找啊。再说了,C++的容器里面还是有list和array,自有其道理啊
10
编译器的注意事项主要指你写代码的顺序不一定和编译之后的执行顺序相同。
例如
int a = 1;
char b = “a”;
有可能编译器会把它变成
char b = “a”;
int a = 1;
这点在多线程里面很重要。
还有现代编译器的优化能力灰常给力,所以LZ两种写法的效率差别可能微乎其微,甚至没有区别。
例如很多人说大块内存直接memcpy会比通过for循环一小块一小块一个一个copy效率要高,本人的测试结果是debug的情况下memcpy确实快不少,release的情况下两者是一样快的。所以不要把精力过于放在这种细节的优化上。事实上选择合适的容器就是最好的优化。
例如
int a = 1;
char b = “a”;
有可能编译器会把它变成
char b = “a”;
int a = 1;
这点在多线程里面很重要。
还有现代编译器的优化能力灰常给力,所以LZ两种写法的效率差别可能微乎其微,甚至没有区别。
例如很多人说大块内存直接memcpy会比通过for循环一小块一小块一个一个copy效率要高,本人的测试结果是debug的情况下memcpy确实快不少,release的情况下两者是一样快的。所以不要把精力过于放在这种细节的优化上。事实上选择合适的容器就是最好的优化。