典型问题分析4—StaticLinkList中数据元素删除时的效率问题

StaticLinkList中数据元素删除时的效率问题

void destroy(Node* pn)
    {
        SNode* space = reinterpret_cast<SNode*>(m_space);
        SNode* psn = dynamic_cast<SNode*>(pn);//从父类指针,转换为子类指针,直接调用dynameic_cast

        for(int i=0; i<N; i++)
        {
            if(psn == (space + i))
            {
                m_used[i] = 0;
                psn->~SNode();
            }
        }
    }

在StaticLinkList中destroy函数的实现如上所示,那么这个for循环就像归还空间。

空间归还,对象析构,即可跳出循环。那为什么还要进行后面的循环,虽然从逻辑上它不会再进入if语句里面,但是效率上就慢了。既然我们已经归还空间,那么就应该立即跳出for循环。需要加上break语句。

原文地址:https://www.cnblogs.com/-glb/p/12345489.html

时间: 2025-01-04 10:52:34

典型问题分析4—StaticLinkList中数据元素删除时的效率问题的相关文章

使用JDBC连接MySQL数据库--典型案例分析(八)----实现员工数据的分页查询

转载请注明:http://blog.csdn.net/uniquewonderq 问题: 使用JDBC连接Mysql数据库,实现对Emp表数据的分页查询功能. 方案: 对于较大的数据量,通常采用分页查询的方式.不同的数据库产品有不同的数据库级的分页查询策略.例如:Oracle通常使用rownum的方式:而Mysql使用limit的方式. Oracle采用rownum和子查询实现分页查询,SQL语句如下, select * from (select rownum rn,empno,ename,jo

vector中的元素删除

删除vector中的元素,最容易的方法就是使用vector的erase()函数. vector vec;for ( vector::iterator iter = vec.begin(); iter! = vec.end();){    if(某条件成立)        iter = vec.erase(iter);    else        iter ++;} 如果要清空vector中的元素,可以使用erase()循环删除,也可以用clear()函数. for ( vector::iter

sql:表中数据全部删除之后,重新插入时,从1开始增加

数据库中设置了自增列,有时候需要清楚数据库从新录入数据.最常见的做法就是使用sql语句"delete 表明名"或是直接选中数据,然后删除数据.但是再次插入数据的时候,你就会发现自增列会从上次删除数据的最大值的下一个值开始,而不是从1开始的.有没有一种感觉,感觉挺苦恼的. 现在有一个最简单暴力的方法,让你删除数据后,再次插入记录的时候,自增列从1开始. 直接从表中,将需要自增的字段进行修改,把自增这个选项进行取消,然后保存,保存之后再次对这个字段进行自增定义,这样子字段就会重新从1开始自

Linux内核分析_UDP协议中数据包的收发处理过程

1.前言 实验基于Linux kernel 3.18.6,实验内容包括: (1)编写UDP客户端和服务端 (2)将UDP客户端和服务端集成到MenuOS中 (3)UDP发送数据的过程 (4)UDP接收数据的过程 本文中完整源码:https://github.com/dangolqy/udp 实验楼环境:https://www.shiyanlou.com/courses/1198 2.UDP客户端和服务端 参考博客:https://blog.csdn.net/lell3538/article/de

典型问题分析3—LinkList中遍历操作与删除操作混合使用

LinkList中遍历操作与删除操作混合使用 删除成功后,list.current()返回什么值? #include <iostream> #include "LinkList.h" using namespace std; using namespace DTLib; int main() { LinkList<int> list; for(int i=0; i<5; i++) { list.insert(i); } for(list.move(0);

javascaipt中数组元素删除方法delete和splice

一.用delete 删除数组中元素(少用) 说明:delete: 只是被删除的元素变成了 undefined ,即数组长度不变 //定义数组 var array=["aa","dd","cc","aa"]; //方法1:delete删除数组元素 delete array[1]; //输出结果 : ["aa",undefined,"cc","aa"] getArray(

javascript中数组元素删除方法splice,用在for循环中巨坑

一.demo splice: 该方法会改变自动原始数组长度 实例: var array = ["aa","dd","cc","aa"]; //方法2:删除数组元素 array.splice(1,1); //输出结果:["aa","cc","aa"] getArray(array); 输出:aa cc aa 数组长度自动减一 二.实际业务场景中 在for循环中使y用 t

链表-1 链表中数据的删除

http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1068 这是一个在链表中删除特定字符的代码,学习链表后第一次编写的一个代码. 1 #include <iostream> 2 #include <stdio.h> 3 #include <cstring> 4 #include <algorithm> 5 #include <math.h> 6 using namespac

有两个数组a和b,把a出现在b中的元素删除,且a自己里面重复的元素也删除。

#include "stdafx.h"int a[] = { 1,2,3,4,5,6,6,5,9,1,2 };int b[] = {5,6};int LEN = sizeof(a) / sizeof(a[0]);void yiwei(int* a,int b) { for (int i = b;i < LEN ;i++) { a[i] = a[i + 1]; } } int main(){ for (int i = 0;i < LEN;i++) { printf("