一般语言都会提供一些逻辑容器的实现,各个语言的实现方式不同;底层的数学算法应该差不多;

动态数组

``

这个没啥可说的,就是一个数组,满了时候,再创建一个数组,把之前的数组里的数据移过来,销毁之前数组;1.

unit Unit4;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.Generics.Collections, System.SyncObjs; type
TForm4 = class(TForm)
btn1: TButton;
btn2: TButton;
procedure btn1Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; /// <summary>
/// 定义一个线程
/// </summary>
TGfThread = class(TThread)
protected
procedure Execute; override;
end; /// <summary>
/// 定义一个线程
/// </summary>
TSfThread = class(TThread)
protected
procedure Execute; override;
end; TSafeList<T> = class
private
list: TList<T>;
lock: TSpinLock;
public
constructor Create;
destructor Destroy; override;
function Add(const Value: T): NativeInt; inline;
procedure Clear; inline;
end; var
Form4: TForm4;
listGf: TThreadList<string>;
listSf: TSafeList<string>; implementation {$R *.dfm} procedure TGfThread.Execute;
var
I: Integer;
start: UInt64;
begin
start := GetTickCount;
for I := 0 to 10000 do
begin
listGf.Add(TGUID.NewGuid.ToString);
end;
OutputDebugString(PChar('耗时: ' + (GetTickCount - start).ToString));
end; procedure TSfThread.Execute;
var
I: Integer;
start: UInt64;
begin
start := GetTickCount;
for I := 0 to 10000 do
begin
listSf.Add(TGUID.NewGuid.ToString);
end;
OutputDebugString(PChar('耗时: ' + (GetTickCount - start).ToString));
end; procedure TSafeList<T>.Clear;
begin
lock.Enter;
list.Clear;
lock.Exit();
end; constructor TSafeList<T>.Create;
begin
inherited;
Self.list := TList<T>.Create;
end; destructor TSafeList<T>.Destroy;
begin
Self.list.Free;
inherited;
end; function TSafeList<T>.Add(const Value: T): NativeInt;
begin
lock.Enter;
Result := list.Add(Value);
lock.Exit();
end; procedure TForm4.btn1Click(Sender: TObject);
var
I: Integer;
begin
listGf.Clear;
for I := 0 to 2 do
begin
with TGfThread.Create do
begin
FreeOnTerminate := True;
end;
end;
end; procedure TForm4.btn2Click(Sender: TObject);
var
I: Integer;
begin
listSf.Clear;
for I := 0 to 2 do
begin
with TSfThread.Create do
begin
FreeOnTerminate := True;
end;
end;
end; initialization
listGf := TThreadList<string>.Create;
listSf := TSafeList<string>.Create;
ReportMemoryLeaksOnShutdown := True; finalization
listGf.Free;
listSf.Free; end.

常用容器:动态数组array、列表list、队列 queue、map或字典、 集合、栈等等的更多相关文章

  1. go 数组(array)、切片(slice)、map、结构体(struct)

    一 数组(array) go语言中的数组是固定长度的.使用前必须指定数组长度. go语言中数组是值类型.如果将数组赋值给另一个数组或者方法中参数使用都是复制一份,方法中使用可以使用指针传递地址. 声明 ...

  2. 使用java代码调用rabbitmq接口进行新增编辑mq用户、虚拟机vhost、动态创建交换机exchange、队列queue以及设置权限,绑定vhost与exchange等操作

    使用java代码操作rabbitmq时,首先需要一个有创建用户等权限的管理员账号,需要在rabbitmq的后台管理页面手动创建这个账号,系统推荐的这几个tag可以让账号有rabbitmq后台管理页面的 ...

  3. 【C++】STL常用容器总结之五:双端队列deque

    6.双端队列deque 所谓的deque是”double ended queue”的缩写,双端队列不论在尾部或头部插入元素,都十分迅速.而在中间插入元素则会比较费时,因为必须移动中间其他的元素.双端队 ...

  4. Go part 4 数据容器(数组,slice,string,map,syncMap,list)

    数组 数组是值类型,因此改变副本的值,不会影响到本身 数组的定义:var 变量名 [元素数量] T 变量名(符合标识符要求即可) 元素数量(整型,可以是const中的值) T(可以是任意基本类型,包括 ...

  5. 5个现在就该使用的数组Array方法: indexOf/filter/forEach/map/reduce详解(转)

    ECMAScript5标准发布于2009年12月3日,它带来了一些新的,改善现有的Array数组操作的方法.然而,这些新奇的数组方法并没有真正流行起来的,因为当时市场上缺乏支持ES5的浏览器.     ...

  6. 三 基于Java动态数组手写队列

    手写队列: package dataStucture2.stackandqueue; import com.lt.datastructure.MaxHeap.Queue; import dataStu ...

  7. python数据结构之动态数组

    数组列表:动态数组(Array List) 简介: 最基础简单的数据结构.最大的优点就是支持随机访问(O(1)),但是增加和删除操作效率就低一些(平均时间复杂度O(n)) 动态数组也称数组列表,在py ...

  8. 使用python实现数组、链表、队列、栈

    引言 什么是数据结构? 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成. 简单来说,数据结构就是设计数据以何种方式组织并存储在计算机中. 比如:列表,集合和字 ...

  9. C#动态数组ArrayList和List<T>的比较

    C#中一维动态数组(即列表)分ArrayList和List<T>两种,其容量可随着我们的需要自动进行扩充 一.ArrayList类(少用) ArrayList位于System.Collec ...

  10. Java程序猿学习C++之数组和动态数组

    数组: #include <iostream> using namespace std; //模板函数 template <class T> void dump(T val) ...

随机推荐

  1. vue tabBar导航栏设计实现5-最终版本

    系列导航 一.vue tabBar导航栏设计实现1-初步设计 二.vue tabBar导航栏设计实现2-抽取tab-bar 三.vue tabBar导航栏设计实现3-进一步抽取tab-item 四.v ...

  2. ECharts大屏数据可视化展板项目 适配rem

    1.在utils文件夹里新建一个rem.js 2.main.js中引入rem.js 3.vscode中下载cssrem插件,配置Root Font Size大小,为1920/20 = 96. 重启vs ...

  3. excel如何自动获取本周工作日的日期显示作为标题(周一至周五)

    一.背景: 每周发周报的标题格式为:本周一到本周五的日期内容,如下:但是每隔一周发送的时候需要改一下周报标题里面的日期,比较麻烦目前的需求是通过函数自动化生成,根据当前的日期去定位出本周一的日期以及本 ...

  4. 【日常踩坑】Debug 从入门到入土

    写代码难免遇到 bug,调试解决 bug 的快慢很影响开发的效率.本文主要是梳理并记录下个人经常用的调试方法(主要以 C/C++ 的 segment fault 为例) 分类 根据调试时机与 bug ...

  5. Laravel - Eloquent 删除数据

        public function ormDelete()     {         # 1.通过模型删除         // $student = Student::where('id',5 ...

  6. 这一次,弄明白JS中的文件相关(二):HTTP请求头和响应头

    (一)前置知识 开始前,我们先来复习一下HTTP的基础知识. HTTP请求分为:请求行.请求头.空行.请求体(也叫正文.请求实体.请求主体). HTTP响应分为:状态行(也叫响应行).响应头.空行.响 ...

  7. STM32CubeMX教程23 FSMC - IS62WV51216(SRAM)驱动

    1.准备材料 开发板(正点原子stm32f407探索者开发板V2.4) STM32CubeMX软件(Version 6.10.0) 野火DAP仿真器 keil µVision5 IDE(MDK-Arm ...

  8. [转帖]解Bug之路-记一次JVM堆外内存泄露Bug的查找

    https://zhuanlan.zhihu.com/p/245401095 解Bug之路-记一次JVM堆外内存泄露Bug的查找 前言 JVM的堆外内存泄露的定位一直是个比较棘手的问题.此次的Bug查 ...

  9. [转帖]【TiDB】快速起步

    1. 存储引擎的的功能 提供数据存储接口并持久化存储数据 2. LSM-tree 的特性 LSM-tree 结构本质上是一个用空间置换写入延迟,用顺序写入替换随机写入的数据结构 3. 数据库技术的发展 ...

  10. [转帖]Clickhouse单机及集群部署详解

    https://www.cnblogs.com/ya-qiang/p/13540016.html 一.ClickHouse简介 ClickHouse是近年来备受关注的开源列式数据库,主要用于数据分析( ...