常用容器:动态数组array、列表list、队列 queue、map或字典、 集合、栈等等
一般语言都会提供一些逻辑容器的实现,各个语言的实现方式不同;底层的数学算法应该差不多;
动态数组
``
这个没啥可说的,就是一个数组,满了时候,再创建一个数组,把之前的数组里的数据移过来,销毁之前数组;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或字典、 集合、栈等等的更多相关文章
- go 数组(array)、切片(slice)、map、结构体(struct)
一 数组(array) go语言中的数组是固定长度的.使用前必须指定数组长度. go语言中数组是值类型.如果将数组赋值给另一个数组或者方法中参数使用都是复制一份,方法中使用可以使用指针传递地址. 声明 ...
- 使用java代码调用rabbitmq接口进行新增编辑mq用户、虚拟机vhost、动态创建交换机exchange、队列queue以及设置权限,绑定vhost与exchange等操作
使用java代码操作rabbitmq时,首先需要一个有创建用户等权限的管理员账号,需要在rabbitmq的后台管理页面手动创建这个账号,系统推荐的这几个tag可以让账号有rabbitmq后台管理页面的 ...
- 【C++】STL常用容器总结之五:双端队列deque
6.双端队列deque 所谓的deque是”double ended queue”的缩写,双端队列不论在尾部或头部插入元素,都十分迅速.而在中间插入元素则会比较费时,因为必须移动中间其他的元素.双端队 ...
- Go part 4 数据容器(数组,slice,string,map,syncMap,list)
数组 数组是值类型,因此改变副本的值,不会影响到本身 数组的定义:var 变量名 [元素数量] T 变量名(符合标识符要求即可) 元素数量(整型,可以是const中的值) T(可以是任意基本类型,包括 ...
- 5个现在就该使用的数组Array方法: indexOf/filter/forEach/map/reduce详解(转)
ECMAScript5标准发布于2009年12月3日,它带来了一些新的,改善现有的Array数组操作的方法.然而,这些新奇的数组方法并没有真正流行起来的,因为当时市场上缺乏支持ES5的浏览器. ...
- 三 基于Java动态数组手写队列
手写队列: package dataStucture2.stackandqueue; import com.lt.datastructure.MaxHeap.Queue; import dataStu ...
- python数据结构之动态数组
数组列表:动态数组(Array List) 简介: 最基础简单的数据结构.最大的优点就是支持随机访问(O(1)),但是增加和删除操作效率就低一些(平均时间复杂度O(n)) 动态数组也称数组列表,在py ...
- 使用python实现数组、链表、队列、栈
引言 什么是数据结构? 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成. 简单来说,数据结构就是设计数据以何种方式组织并存储在计算机中. 比如:列表,集合和字 ...
- C#动态数组ArrayList和List<T>的比较
C#中一维动态数组(即列表)分ArrayList和List<T>两种,其容量可随着我们的需要自动进行扩充 一.ArrayList类(少用) ArrayList位于System.Collec ...
- Java程序猿学习C++之数组和动态数组
数组: #include <iostream> using namespace std; //模板函数 template <class T> void dump(T val) ...
随机推荐
- vue tabBar导航栏设计实现4-再次抽取MainTabBar
系列导航 一.vue tabBar导航栏设计实现1-初步设计 二.vue tabBar导航栏设计实现2-抽取tab-bar 三.vue tabBar导航栏设计实现3-进一步抽取tab-item 四.v ...
- COM组件开发-关于在开发环境下COM组件的(来自 HRESULT 的异常:0x80080005 (CO_E_SERVER_EXEC_FAILURE)) 以及 在CLR语言下可能报错 未能加载文件或程序集“Interop.xxx 的问题
1.关于在开发环境下COM组件的(来自 HRESULT 的异常:0x80080005 (CO_E_SERVER_EXEC_FAILURE)) 开发环境下,COM组件注册的文件 不一定是你自己现在程序调 ...
- Redis6常用语句
格式:(待补充) /redis-6.2.4/src/redis-cli -h $ip -p $port -a $password [command] #以下ip/port/password根据实际情况 ...
- 大四上 | 计算机综合课设(OS)· 答辩经验帖
课设代码 repo 被问了如下问题: 我们的 OS 中是否有 idle 进程. 背景:如果所有进程都被 kill 掉了,那么 os 就会陷入死循环.即使再发生需要响应的事情,比如希望再创建个进程 或者 ...
- java使用递归及迭代方式实现前序遍历 中序遍历 后序遍历 以及实现层序遍历
本文为博主原创,转载请注明出处: 目录: 一.快速理解前序,中序,后序遍历的区别 二.使用递归的方式实现前序,中序,后序遍历 三. 使用迭代的方式实现前序 中序 后序遍历 四.层序遍历 一.快速理解前 ...
- 【一文秒懂】Ftrace系统调试工具使用终极指南
[一文秒懂]Ftrace系统调试工具使用终极指南 1.Ftrace是什么 Ftrace是Function Trace的简写,由 Steven Rostedt 开发的,从 2008 年发布的内核 2.6 ...
- [转帖]VMware常用软件ISO下载汇总(2023年6月更新)
https://www.dinghui.org/vmware-iso-download.html#vcsa-patch 请访问 www.dinghui.org 获得最新版,文章将持续更新.[最后更新时 ...
- ebpf 单行程序学习
ebpf 单行程序学习 背景 公司方神借给我一本: <BPF之巅:洞悉linux系统和应用性能>纸质书 拿回家晚上在沙发上看了几天. 感觉书很厚看的不是很系统. 仅能凭自己的感觉总结一下这 ...
- [转贴]中国铁塔发布2020年中期财报:营收、利润双增,高效支撑5G规模建设
中国铁塔发布2020年中期财报:营收.利润双增,高效支撑5G规模建设 https://tech.sina.com.cn/roll/2020-08-11/doc-iivhuipn8046256.sh ...
- 【贪心】AGC018C Coins
Problem Link 现在有 \(X+Y+Z\) 个人,第 \(i\) 个人有三个权值 \(a_i,b_i,c_i\),现在要求依次选出 \(X\) 个人,\(Y\) 个人和 \(Z\) 个人(一 ...