erlang list:delete不建议使用

  成长就是一个不断积累的过程,记录点点游戏项目中的一些吹毛求疵的优化。菜鸟己见,欢迎不认同者,批评指教!!!

  首先我们看erlang自带的lists:delete源码

  delete(Item,[Item|Rest]) ->Rest;

  delete(Item,[H|Rest]) ->

    [H|delete(Item,Rest)];

  delete(_,[]) ->[].

  此段代码首先不是尾递归,不用尾递归的弊处在这里我就不多说了,这个函数有点误导,不看介绍,以为是删除所有符合的元素,其实只是删除第一个符合要求的元素,之所以不用尾递归,而且只删第一个元素,我想有它特定的用处吧,它这种做法,能保证被处理过后的list顺序不会发生变化,而且只删一个。

  我个人写了个尾递归的如下(删除所有符合要求元素,得到的列表顺序反了)

  delete(Item,List) ->

    delete1(Item,List,[]).

  delete1(_,[],L)->

    L;

  delete1(Item,[Temp|List],L) ->

    case Item =:= Temp of

        true ->

          delete1(Item,List,L);

        false ->

          delete1(Item,List,[Temp|L])

  end.

   PS:我这种只是为了写成尾递归,它的时间效率和源码中的lists:delete效率差不多 ,缺点顺序反了,我自己写了测试100万元素的情况下,效率差不多,当然高手是不会写这种的,高手一般都用列表解析,它的效率一般是源码lists:delete的两倍以上,[Temp||Temp<-List,Temp=/=Item],如果你是删除列表中所有Item,极力推荐使用前面所说的列表解析方法。

  当然如果你的列表长度不长,又不会出现重复的,lists:delete和列表解析差不多,几乎没啥影响,而且如果你确实也只需要删除一个元素,那还是用lists:delete吧。

  总而言之,我只是说出了几种不同方式,如何在游戏代码中高效合理应用,还需个人斟酌。

时间: 2024-08-05 10:15:35

erlang list:delete不建议使用的相关文章

centos 7下rabbitmq安装

安装erlang环境 添加rabbitmq依赖的erlang yum命令repos # In /etc/yum.repos.d/rabbitmq-erlang.repo [rabbitmq-erlang] name=rabbitmq-erlang baseurl=https://dl.bintray.com/rabbitmq/rpm/erlang/20/el/7 gpgcheck=1 gpgkey=https://www.rabbitmq.com/rabbitmq-release-signing

七个你必须重视的 Git 使用技巧

与其他技术相比,Git应该拯救了更多开发人员的饭碗.只要你经常使用Git保存自己的工作,你就一直有机会可以将代码退回到之前的状态,因此就可以挽回那些你深夜里迷迷糊糊犯下的错误. 尽管这么说,Git的命令行界面可是出了名的难掌握.接下来,就给大家介绍7个小技巧,最大限度发挥Git的作用. 通常,大部分时间我们都只会用到add.commit.branch和push/pull这些命令.大部分人熟悉这套只往一个方向运转的工作流.你们有没有想过,如果自己往仓库中添加了错误的文件,或是将代码提交到了错误的分

C++学习系列一

第一部分:引用VS指针 引用的含义:变量的别名 注意:变量不能只有别名,必须有一个真实的变量与之相对应 基本数据类型的引用 对别名本身的操作和它的实体的操作是一样的 1.基本数据类型的引用 类型 &变量引用名=变量名 上述程序输出结果为:10 2.结构体数据类型的引用 类型 &结构体引用名=结构体名 上述程序输出结果为:10 20 3.指针类型的引用 类型 *&指针引用名=指针 上述程序输出结果为:20 4.引用作为函数参数 上述程序输出结果为:x=20,y=10 注意:推荐使用右

七个你无法忽视的Git使用技巧(转)

与其他技术相比,Git应该拯救了更多开发人员的饭碗.只要你经常使用Git保存自己的工作,你就一直有机会可以将代码退回到之前的状态,因此就可以挽回那些你深夜里迷迷糊糊犯下的错误. 尽管这么说,Git的命令行界面可是出了名的难掌握.接下来,就给大家介绍7个小技巧,最大限度发挥Git的作用. 通常,大部分时间我们都只会用到add.commit.branch和push/pull这 些命令.大部分人熟悉这套只往一个方向运转的工作流.你们有没有想过,如果自己往仓库中添加了错误的文件,或是将代码提交到了错误的

七个你无法忽视的 Git 使用技巧

与其他技术相比,Git应该拯救了更多开发人员的饭碗.只要你经常使用Git保存自己的工作,你就一直有机会可以将代码退回到之前的状态,因此就可以挽回那些你深夜里迷迷糊糊犯下的错误. 尽管这么说,Git的命令行界面可是出了名的难掌握.接下来,就给大家介绍7个小技巧,最大限度发挥Git的作用. 通常,大部分时间我们都只会用到add.commit.branch和push/pull这 些命令.大部分人熟悉这套只往一个方向运转的工作流.你们有没有想过,如果自己往仓库中添加了错误的文件,或是将代码提交到了错误的

git常用

1. 修改错误的提交信息(commit message) 提交信息很长时间内会一直保留在你的代码库(code base)中,所以你肯定希望通过这个信息正确地了解代码修改情况. 下面这个命令可以让你编辑最近一次的提交信息,但是你必须确保没有对当前的代码库(working copy)做修改,否则这些修改也会随之一起提交. ? 1 $ git commit --amend -m ”YOUR-NEW-COMMIT-MESSAGE” 假如你已经将代码提交(git commit)推送(git push)到了

Hibernamte框架的学习--第三天

一. 对多|多对一 1.  关系表达 1)表中的表达 2)实体中的表达 3)元数据中的表达 一对多 多对一 2.  操作     1). 操作关联属性 /** * 一对多|多对一 * @author vanguard * */ public class Demo { /** * 保存客户以及客户下的联系人 */ @Test public void fun1() { //1. 获得session对象 Session session = HibernateUtils.getSession(); //

前端开发规范文档(html,css,js)

首先吐槽一句,本来想上传word文档的,可是发现博客不能上传word文档,这就很尴尬了. 首先声明该规范不是本人写的,网上搜前端规范发现这个很详细就先复制下来做笔记,当然不可能啥都按规范来,每个公司的规范都不一样..仅供参考 前端开发规范文档 Html规范 1 代码风格 1.1 缩进 **[强制]**使用 4 个空格作为一个缩进层级,不允许使用 2 个空格或 tab 字符: 2 属性 2.1 属性引号 **[强制]**对于属性的定义使用双引号,不允许使用单引号,不允许不使用引号: 示例: <!-

MySQL数据库的基础操作及理解

使用数据库的步骤: 链接MySQL服务器 选择数据库 对数据表进行增删改查 关闭数据库 退出 quit exit \q 常见操作 \c 取消未完成的操作. \g 代替结束符 数据库操作: show databases 查看数据库 注意:查看所有数据库,mysql数据库千万不要动. 创建数据库 create database 数据库名 注意:库名不要用中文,不要用数字开头. 注意: 1.每创建一个数据库,会在data目录下创建一个以数据库名称命名的文件夹. 2.数据库是唯一的. 删除数据库 dro