简易Map模板
非红黑树,排序+二分搜索,查找修改O(logN),插入删除O(N)
#ifndef MAP_H
#define MAP_H
#include "main.h" /*----------Custom----------*/
typedef struct{
short* Addr;
short MaxValue;
short MinValue;
uchar ReadOnly;
} MODBUS_DataType; #define MAP_TypeKey ushort
#define MAP_TypeValue MODBUS_DataType /*----------End----------*/
typedef struct{
MAP_TypeKey Key;
MAP_TypeValue Value;
} MAP_Element; #define MAP_MaxSize 20 typedef struct{
MAP_Element Element[MAP_MaxSize];
int Size;
} MAP_TypeDef; #ifdef MAP_C
#include "stdlib.h" void MAP_Swap(MAP_Element* a, MAP_Element* b); /*----------Custom----------*/
int MAP_Compare(const void* a, const void* b)
{
return (*(MAP_Element*)a).Key - (*(MAP_Element*)b).Key;
} /*----------End----------*/ #endif int MAP_Find (MAP_TypeDef* mp, MAP_TypeKey key );
void MAP_Insert(MAP_TypeDef* mp, MAP_TypeKey key, MAP_TypeValue value);
void MAP_Erase (MAP_TypeDef* mp, MAP_TypeKey key );
char MAP_Get (MAP_TypeDef* mp, MAP_TypeKey key, MAP_TypeValue* out );
char MAP_Set (MAP_TypeDef* mp, MAP_TypeKey key, MAP_TypeValue value); #endif
#define MAP_C
#include "map.h" int MAP_Find(MAP_TypeDef* mp, MAP_TypeKey key)
{
int l = 0;
int r = mp->Size; MAP_Element tmp;
tmp.Key = key; while(l <= r)
{
ushort mid = (l + r) >> 1;
int ans = MAP_Compare(&mp->Element[mid], &tmp);
if(ans > 0)
{
r = mid - 1;
}
else if(ans < 0)
{
l = mid + 1;
}
else
{
return mid;
}
}
return -1;
} void MAP_Swap(MAP_Element* a, MAP_Element* b)
{
MAP_Element tp;
tp = *a;
*a = *b;
*b = tp;
} void MAP_Insert(MAP_TypeDef* mp, MAP_TypeKey key, MAP_TypeValue value)
{
MAP_Element tmp;
tmp.Key = key;
tmp.Value = value; if(mp->Size == 0)
{
mp->Element[0] = tmp;
mp->Size ++;
return;
} int pos;
for(pos = 0; pos < mp->Size; pos ++)
{
int ans = MAP_Compare(&mp->Element[pos], &tmp);
if(ans == 0)
{
mp->Element[pos] = tmp;
return;
}
else if(ans > 0)
{
break;
}
} for(int i = mp->Size; i > pos; i --)
{
mp->Element[i] = mp->Element[i - 1];
}
mp->Element[pos] = tmp;
mp->Size ++;
} void MAP_Erase(MAP_TypeDef* mp, MAP_TypeKey key)
{
MAP_Element tmp;
tmp.Key = key; int pos;
for(pos = 0; pos < mp->Size; pos ++)
{
int ans = MAP_Compare(&mp->Element[pos], &tmp);
if(ans == 0)
{
break;
}
else if(ans > 0)
{
return;
}
} mp->Size --;
for(int i = pos; i < mp->Size; i ++)
{
mp->Element[i] = mp->Element[i + 1];
}
} char MAP_Get(MAP_TypeDef* mp, MAP_TypeKey key, MAP_TypeValue* out)
{
MAP_Element tmp;
tmp.Key = key; int pos = MAP_Find(mp, tmp.Key);
if(pos == -1)
{
return 1;
} *out = mp->Element[pos].Value;
return 0;
} char MAP_Set(MAP_TypeDef* mp, MAP_TypeKey key, MAP_TypeValue value)
{
MAP_Element tmp;
tmp.Key = key;
tmp.Value = value; int pos = MAP_Find(mp, tmp.Key);
if(pos == -1)
{
return 1;
} mp->Element[pos] = tmp;
return 0;
}
简易Map模板的更多相关文章
- PHP实现简易的模板引擎
PHP实现简易的模板引擎 1.MVC简介 MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式(详情自己百度): 1. Mode ...
- 简易js模板引擎
前面 js 模板引擎有很多很多,我以前经常用 art-template ,有时候也会拿 vue 来当模板引擎用. 直到...... 年初的时候,我还在上个项目组,那时候代码规范是未经允许不能使用 [外 ...
- Map 模板
#include<stdio.h> #include<iostream> #include<map> using namespace std; typedef pa ...
- 一个极其简易版的vue.js实现
前言 之前项目中一直在用vue,也边做边学摸滚打爬了近一年.对一些基础原理性的东西有过了解,但是不深入,例如面试经常问的vue的响应式原理,可能大多数人都能答出来Object.defineProper ...
- 基于vite2+electron12后台管理模板|Electron后台框架系统
前一溜时间有给大家分享一个 electron+vite跨端短视频 项目.这次分享的是vite2.x和electron实现跨平台后台框架,支持国际化多语言配置.导航菜单+树形菜单两种路由菜单模式.展开/ ...
- JS模板引擎 :ArtTemplate (2)
上一篇初略的介绍了一下javascript中的模板引擎,有兴趣的可以戳 这里 . 这一篇将带着大家一起做一个简易的模板引擎, 上一篇介绍到:模板引擎其实做的就是两件事. 根据一定的规则,解析我们所定义 ...
- Zabbix实战-简易教程系列
一.基础篇(安装和接入) Zabbix实战-简易教程--总流程 Zabbix实战-简易教程--整体架构图 Zabbix实战-简易教程--DB安装和表分区 Zabbix实战-简易教程--Server端 ...
- 一个简单的PHP模板引擎
PHP早期开发中通常是PHP代码和HTML代码混写,这也使代码中充斥着数据库操作,逻辑处理等.当项目不大时,这样的代码还可以接受,但是随着项目不断扩大,我们就会发现同一个文件中同时存在前端逻辑和后端处 ...
- 6、jeecg 笔记之 自定义excel 模板导出(一)
1.前言 jeecg 中已经自带 excel 的导出导出功能,其所使用的是 easypoi,尽管所导出的 excel 能满足大部分需求, 但总是有需要用到自定义 excel 导出模板,下文所用到的皆是 ...
- 三个小时学会wordpress模板制作
最近接了一个项目需要用wordpress建站,版面相对简单,ytkah就琢磨着自己来设计wordpress模板,首页栏目页文章页(很多网站无外乎就这些页面),其中栏目页和首页又很像,都是调用文章列表. ...
随机推荐
- 前端随笔0:URL与状态的双向绑定
记录一些最近写前端的思考总结,也算是给自己的技术随笔开个篇 在接触以 React,Vue 为代表的工程化前端框架前,我还是一个拿着 jQuery 手撸特效和手写 CSS 的切图仔,捣鼓 Vue 时接触 ...
- Canonical为所有支持的Ubuntu LTS系统发布了新的Linux内核更新
Canonical近日为所有支持的Ubuntu LTS系统发布了新的Linux内核更新,以解决总共19个安全漏洞. 新的Ubuntu内核更新仅适用于长期支持的Ubuntu系统,包括Ubuntu 22. ...
- pdf.js 跨域完美解决!
在网上查看很多方法去解决此类跨域问题,及如何动态加载pdf文件.看来看去 请求的由后台处理加header头的 pdf.js 自带的 获取地址栏param参数值的 都是很麻烦的步骤并且有时不能有效解决 ...
- 只会Jquery,后端程序员如何学会前端(webpack,react,babel,es5,es6)
写在前 希望通过短暂的学习,可以达到一下目标: 1.能看懂现在前端的工程化手段 2.知道当前前端群体中大致的解决问题的思路 3.当前的问题在哪里,技术发展趋势是什么 4.建立起自己的认知模型 文章内容 ...
- 对称加密、非对称加密 与 HTTPS
一.对称加密(Symmetric Cryptography)对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key). ...
- WSL2安装nvm并配置npm镜像源
1.下载安装脚本并执行 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash 2.关闭命令行后 ...
- elasticsearch别名
es创建别名的好处: 1.不暴露索引名 2.可以为多个结构类似的索引(动态索引)创建相同的别名,查询的时候直接查询别名 ,然后自动匹配多个索引. 在不同的索引创建窗口.比如,如果为数据创建了每日索引, ...
- windows mongo 开启副本集 6.x版本 mongo : 无法将“mongo”项识别为 cmdlet、函数、脚
mongo报错 当前使用版本6.0.3,bin目录下并没有mongo.exe,所以没有mongo命令, 需要下载 https://www.mongodb.com/try/download/shell ...
- nvm安装及使用(windon/mac)
有必要说一下nvm,因为大家做前端对node都很熟悉吧.前端的很多项目中都依赖node,还有可能每个项目依赖的node版本不一样,这样我们就上了nvm. nvm 是node Version Manag ...
- word生成产生错误的原因
技术背景 很多时候我们网站或者系统需要提供一些word文件,例如证明.docx或者订单.docx等文件供用户下载打印等. 用Java操作word文档,毫无疑问,当下最流行apache poi,对于po ...