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

动态数组

``

这个没啥可说的,就是一个数组,满了时候,再创建一个数组,把之前的数组里的数据移过来,销毁之前数组;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. div模拟表格单元格合并

    效果如下图: html代码如下: 1 <ul class="schedule-list"> 2 <li class="schedule-title&qu ...

  2. webpack配置自动打包相关的参数

  3. poj 3268 最短路

    ***题意:在x这个点有个聚会,其他的点要到x这个点,然后再会自己原始的点,求一来一回最大的那个距离 做法:两边dijstra算法,因为是单向图,要注意更新顺序*** #include<iost ...

  4. Postman调试grpc

    转载请注明出处: 1.检查自己的postman是否支持 grpc,通过 File -> new -> ,出现如下图,则表示支持: 2.点击上图的grpc就会自动创建一个 grpc 的req ...

  5. kafka 在 zookeeper 中保存的数据内容

    转载请注明出处: 1. 服务器上下载 kafka : wget https://archive.apache.org/dist/kafka/2.4.0/kafka_2.12-3.2.0.tgz 2.  ...

  6. 比Nginx更好用的Gateway!

    比Nginx更好用的Gateway! Token新开源Gateway,使用yarp实现的一个反向代理,支持界面操作动态添加集群添加路由绑定,并且支持动态添加域名绑定https证书,超强yarp+Fre ...

  7. VS中多个源文件中只运行其中特定文件

    1.问题 有时候一个项目中创建了多个源文件,但是我只想运行其中的一个,一起运行就会出现多个main入口的问题 2.解决方式 2.1 右键要排除的文件,点击属性 2.2 从生成中排除一项中选择是即可 2 ...

  8. 【SHELL】查找文件并删除

    find . -iname file-name |xargs -I % rm -rf %

  9. 【转】嵌入式C语言代码优化方案

    来源:嵌入式C语言代码优化方案(深度好文,建议花时间研读并收藏) (qq.com) 1.选择合适的算法和数据结构 选择一种合适的数据结构很重要,如果在一堆随机存放的数中使用了大量的插入和删除指令,那使 ...

  10. 0xGame 2023【WEEK4】Crypto WP

    Danger Leak 查看代码 from random import * from secret import flag from Crypto.Util.number import * m = b ...