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

动态数组

``

这个没啥可说的,就是一个数组,满了时候,再创建一个数组,把之前的数组里的数据移过来,销毁之前数组;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. [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause 解决

    Navicat 连接mysql 执行 CREATE TABLE  语句 执行成功后总是包如下错误 [Err] 1055 - Expression #1 of ORDER BY clause is no ...

  2. 九、dockerfile指令讲解

    系列导航 一.docker入门(概念) 二.docker的安装和镜像管理 三.docker容器的常用命令 四.容器的网络访问 五.容器端口转发 六.docker数据卷 七.手动制作docker镜像 八 ...

  3. 一、docker入门(概念)

    系列导航 一.docker入门(概念) 二.docker的安装和镜像管理 三.docker容器的常用命令 四.容器的网络访问 五.容器端口转发 六.docker数据卷 七.手动制作docker镜像 八 ...

  4. 用canvas实现验证码的绘制

    login.vue主文件 1 <template> 2 <div class="login-wrapper"> 3 <img src=".. ...

  5. Ribbon默认负载均衡规则替换为NacosRule

    近期博主在参与一个 Spring Cloud 搭建,版本为 Hoxton.SR12,服务注册发现组件为 Nacos 的老项目时,发现项目负载均衡组件 Ribbon 的负载均衡规则在某些场景下不够完美, ...

  6. java进阶(12)--8种数据包装类型、Integer、常用方法

    一.基本数据类型与包装类型 8种基本数据类型,对应的包装类,父类 1.byte-->java.lang.Byte-->Number 2.short-->java.lang.Short ...

  7. [转帖]一文深度讲解JVM 内存分析工具 MAT及实践(建议收藏)

    https://juejin.cn/post/6911624328472133646 1. 前言 熟练掌握 MAT 是 Java 高手的必备能力,但实践时大家往往需面对众多功能,眼花缭乱不知如何下手, ...

  8. [转帖]oceanbase 的简单介绍

    English | 中文版 OceanBase Database 是一个分布式关系型数据库.完全由蚂蚁集团自主研发. OceanBase 基于 Paxos 协议以及分布式架构,实现了高可用和线性扩展. ...

  9. [转帖]TiDB系统调参实战经验

    https://tidb.net/blog/c9466c40#TiDB%E7%B3%BB%E7%BB%9F%E8%B0%83%E5%8F%82%E5%AE%9E%E6%88%98%E7%BB%8F%E ...

  10. [粘贴]使用 Dumpling 导出数据

    https://docs.pingcap.com/zh/tidb/stable/dumpling-overview#dumpling-%E4%B8%BB%E8%A6%81%E9%80%89%E9%A1 ...