算法导论数据结构篇---vector

Java中对比Vector, ArrayList, LinkedList的区别 创作不易,请大家多多支持。我们在日常的工作中,能够高效地管理和操作数据是非常重要的。由于每个编程语言支持的数据结构不尽相同,比如我最早学习的 C语言,需要自己实现很多基础数据结构,管理和操作会比较麻烦。相比之下,Java 则要方便的多,针对通用场景的需求,Java提供了强大的集合框架,大大提高了开发者的生产力。今天我要问你的是有关集合框架方面的问题,对比Vector、ArrayList、LinkedList 有何区别? 阅读详情

向量就是动态数组。直接上stl源码:

//myvector.h
#include"mymemory.h"
#include"myiterator.h"
#include"myconstruct.h"
using std::copy_backward;
using std::max;
template<class T,class Alloc=alloc>
class vector
{
public:
	typedef T    value_type;//此句定义之后,所以的类型都与value_type而非T有关
	typedef value_type*  pointer;
	typedef value_type* iterator;
	typedef value_type& reference;
	typedef size_t          size_type;
	typedef ptrdiff_t       defference_type;

protected:
	//定义属于自己的配置器
	typedef simple_alloc<value_type,Alloc> data_allocator;

	iterator start;//使用空间的头
	iterator finish;//使用空间的尾
	iterator end_of_storage;//可用空间的尾

	void insert_aux(iterator position,const T& x);
	void deallocate()//对配置函数的包装
	{
		if(start)
			data_allocator::deallocate(start,end_of_storage-start);
	}
	void fill_initialize(size_type n,const T& value)
	{
		start=allocate_and_fill(n,value);
		finish=start+n;
		end_of_storage=finish;
	}

public:
	iterator begin(){ return start;}
	iterator end(){return finish;}
	size_type size()const {return size_type(finish-start);}
	size_type capacity() const{return size_type(end_of_storage-begin());}
	size_type empty() const{return begin()==end();}
	reference operator[](size_type n) {return *(begin()+n);}

	vector():start(0),finish(0),end_of_storage(0){ }
	vector(size_type n,const T& value){fill_initialize(n,value);}
	explicit vector(size_type n) { fill_initialize(n,T());}

	~vector(){ destroy(start,finish);deallocate();}

	reference front(){return *begin();}
	reference back(){return *(end()-1);}
	void push_back(const T& x)
	{
		if(finish!=end_of_storage){
			construct(finish,x);//全局函数
			++finish;
		}else
			insert_aux(end(),x);//会配置新空间
	}
	void pop_back(){--finish;destroy(finish);}
	//从position开始,插入n个元素,元素初值为x
	void insert(iterator position,size_type n,const T& x);
	//在position处插入x
	void insert(iterator position,const T& x){ insert(position,1,x);}
	iterator erase(iterator position){//清除某位置上的元素
		if(position+1!=end())
			copy(position+1,finish,position);
		--finish;
		destroy(finish);
		return position;
	}
	iterator erase(iterator first,iterator last);
	void resize(size_type new_size,const T& x)
	{
		if(new_size<size())
			erase(begin()+new_size,end());
		else
			insert(end(),new_size-size(),x);
	}
	void resize(size_type new_size){ resize(new_size,T());}
	void clear(){erase(begin(),end());}
protected:
	iterator allocate_and_fill(size_type n,const T& x)
	{
		iterator result=data_allocator::allocate(n);
		uninitialized_fill_n(result,n,x);
		return result;
	}
};
//--------------------------------------------------------------------
template<typename T,class Alloc>
void vector<T,Alloc>::insert_aux(iterator position,const T& x)
{
	if(finish!=end_of_storage){//还有空间
		construct(finish,*(finish-1));//在备用空间除,构造一个元素,其值为vector中最后一个元素
		++finish;
		T x_copy=x;
		copy_backward(position,finish-2,finish-1);
		*position=x_copy;
	}else{
		const size_type old_size=size();
		const size_type len=(old_size!=0)?2*old_size:1;//如果原来大小是0的话,新长度为1
		iterator new_start=data_allocator::allocate(len);
		iterator new_finish=new_start;
		try{
			//将原vector拷贝到新vector
			new_finish=uninitialized_copy(start,position,new_start);
			//为新元素设定初值
			construct(new_finish,x);
			++new_finish;
			new_finish=uninitialized_copy(position,finish,new_finish);
		}catch(...){
			//commit or rollback
			destroy(new_start,new_finish);
			data_allocator::deallocate(new_start,len);
			throw;
		}
		
		//析构,释放原vector
		destroy(begin(),end());
		deallocate();

		start=new_start;
		finish=new_finish;
		end_of_storage=new_start+len;
	}
}
//-------------------------------------------------------------------------------
template<typename T,typename Alloc>
typename vector<T,Alloc>::iterator vector<T,Alloc>::erase(iterator first,iterator last)
{
	iterator i=copy(last,finish,first);
	destroy(i,finish);
	finish=finish-(last-first);
	return first;
}
//----------------------------------------------------------------------------
//这段代码我觉得写得非常不好,因为进行数据移动时,明明可以一次移动成功的,
 //却非得分段多次移动
template<typename T,typename Alloc>
void vector<T,Alloc>::insert(iterator position,size_type n,const T& x)
{
	if(n!=0){
		if(size_type(end_of_storage-finish)>=n){
			//备用空间足够
			T x_copy=x;
			const size_type elems_after=finish-position;
			iterator old_finish=finish;
			if(elems_after>n){
				//插入点之后的现有元素个数大于新增元素个数
				uninitialized_copy(finish-n,finish,finish);
				finish+=n;
				copy_backward(position,old_finish-n,old_finish);
				fill(position,position+n,x_copy);
			}else{
				//插入点之后的现有元素个数小于等于新增元素个数
				uninitialized_fill_n(finish,n-elems_after,x_copy);
				finish+=n-elems_after;
				uninitialized_copy(position,old_finish,finish);
				finish+=elems_after;
				fill(position,old_finish,x_copy);
			}
		}else{
			//备用空间小于新增元素个数
			const size_type old_size=size();
			const size_type len=old_size+max(old_size,n);
			iterator new_start=data_allocator::allocate(len);
			iterator new_finish=new_start;
			try{
				new_finish=uninitialized_copy(start,position,new_start);
				new_finish=uninitialized_fill_n(new_finish,n,x);
				new_finish=uninitialized_copy(position,finish,new_finish);
			}catch(...){
				//commit and rollback
				destroy(new_start,new_finish);
				data_allocator::deallocate(new_start,len);
				throw;
			}

			destroy(start,finish);
			deallocate();//重包装过的函数
			start=new_start;
			finish=new_finish;
			end_of_storage=new_start+len;
		}
	}
}
//---------------------------------------------------------------------------
	



Vector、ArrayList、LinkedList 有何区别? 如果面试问道 Vector、ArrayList、LinkedList 有何区别? 你会如何回答呢? 我的回答 这三者都是实现集合框架中的 List,也就是所谓的有序集合,因此具体功能也比较近似,比如都提供按照位置进行定位、添加或者删除的操作,都提供迭代器以遍历其内容等。但因为具体的设计区别,在行为、性能、线程安全等方面,表现又有很大不同。 Vector 是 Java 早期提供的线程安全的动态数组,如果不需要线程安全,并不建议选择,毕竟同步是有额外开销的。Vector 内部是使用对象数组来保存数据,可以根 阅读详情

相关推荐

08:对比Vector、ArrayList、LinkedList有何区别?

我们在日常的工作中,能够高效地管理和操作数据是非常重要的。由于每个编程语言支持的数据结构不尽相同,比如我最早学习的 C 语言,需要自己实现很多基础数据结构,管理和操作会比较麻烦。相比之下,Java 则要方便的多,针对通用场景的需求,Java 提供了强大的集合框架,大大提高了开发者的生产力。 今天我要问你的是有关集合框架方面的问题,对比 Vector、ArrayList、LinkedList 有何区别? 典型回答 这三者都是实现集合框架中的 List,也就是所谓的有序集合,因此具体功能也比较近似

Java 后端|Python|AI 实战博主。专注微服务、分布式、大模型应用开发,输出可落地项目、源码剖析与面试总结。用通俗文字拆解技术难点,记录开发路上的学习与踩坑,期待和大家一起交流成长。 340

C++中vector实现及使用详解

vector是)C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的 1、vectot与array        vector与array非常相似。两者的唯一区别在于空间的运用的灵活性。array是静态空间,一旦配置了就不能改变;vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以

lkn910907的专栏 1620

想在瑞芯微RK3588上跑视频分类模型?避开3D卷积这个坑,试试这几种NPU友好的方案

本文探讨了在瑞芯微RK3588上部署视频分类模型时如何避开3D卷积的性能陷阱,提供了三种NPU友好的替代方案:MobileNetV2+GRU组合、Temporal Shift Module(TSM)和帧级池化。这些方案在保持较高准确率的同时,充分利用RKNPU的硬件加速能力,显著提升推理效率。文章还分享了从模型转换到部署优化的完整流程和实战经验。

weixin_28724319的博客 418

STL Vector remove()、erase()的使用与iterator使用陷阱

STL中remove()的使用 STL中remove()只是将待删除元素之后的元素移动到vector的前端,而不是删除。若要真正移除,需要搭配使用erase()。 #include &amp;amp;amp;amp;lt;iostream&amp;amp;amp;amp;gt; #include &amp;amp;amp;amp;lt;vector&amp;amp;amp;amp;gt; #include &amp;amp;amp;amp;lt;algorit

桑凯旋的博客 1601

Day2 十分钟带你解决逆向中对称加密算法 (RC4)

在密码学中,RC4(来自Rivest Cipher 4的缩写)是一种串流加密算法,密钥长度可变。他加密解密使用相同的密钥,因此也被称为“流加密算法”。RC4由伪随机数生成器和异或运算组成。RC4的密钥长度可变,范围是[1,255]。RC4一个字节一个字节地加解密。给定一个密钥,伪随机数生成器接受密钥并产生一个S盒。S盒用来加密数据,而且在加密过程中S盒会变化。由于异或运算的对合性,RC4加密解密使用同一套算法。

m0_73779708的博客 1289

STM32CubeMX+FreeRTOS+CAN总线+传感器实战:多任务系统与通信融合开发详解

本文详细介绍了基于STM32CubeMX和FreeRTOS的CAN总线与光电传感器融合开发实战。通过多任务系统设计,实现传感器数据采集与CAN通信的协同工作,提供完整的配置例程和调试技巧,适用于工业控制与机器人感知等应用场景。

n2o3p4的博客 735

vector::erase(iterator first, iterator last)使用须知

    今天使用了vector::erase删除函数,开始以为就是删除包括两个参数在内的元素,因为其它代码的关系,调试了一个多小时才知道是erase的问题,我们知道,要清除vector所有元素用clear(),它调用的是erase( begin(), end()),这样我们就不难知道,删除连续几个元素时,first指向第一个元素位置,last应该指向要删除最后一个元素的下一个元素位置. 

极速飞翔的专栏 2337

谐振电路原理与应用场景全解析

本文全面解析了谐振电路的原理、类型及其核心应用。详细阐述了串联谐振与并联谐振的工作特性,并重点介绍了其在无线通信调谐、音频处理分频以及电力系统滤波与无功补偿等关键场景中的实际作用。通过公式推导与实例分析,帮助读者深入理解LC谐振的选频与能量交换机制。

t1u2v的博客 840

《算法导论》第11章 散列表 (1)直接寻址表

(一)直接寻址表 关键字集合U = { 0, 1, ..., m - 1 },实际的关键字集合K。 用一个数组T[0..m - 1],其中每个位置对应U中的一个关键字。 直接寻址表的问题: (1)如果U很大,要保存|U|大小的一张表T有点不实际。 (2)实际存储的关键字集合K相对U来说可能很小,因而分配给T的大部分空间都要浪费掉。

西代零零发 4965

[网络安全提高篇] 一二九.Powershell恶意代码检测 (5)混淆和反混淆 [上]

前文介绍了如何利用MS Defender实现恶意样本家族批量标注。这篇文章将继续讲解Powershell恶意代码检测,主要包括PowerShell混淆与反混淆内容,首先结合Invoke-Obfuscation工具详细介绍PowerShell代码混淆方法,再结合PowerDecode工具阐述解混淆方法。该研究将为后续的恶意软件家族分类或溯源提供帮助。未完待续,基础性文章,希望您喜欢,且看且珍惜。

杨秀璋的专栏 1541

【乐企】有关乐企能力测试接口对接-基础版(详细)

乐企能力测试接口对接详细代码以及步骤

九七的博客 7663

BUPT 数据结构与算法导论---使用vector实现顺序表

简要记录一下答案.

m0_62121252的博客 699

轴承寿命预测 | 基于BiLSTM双向长短期记忆神经网络的轴承寿命预测附matlab完整代码

轴承寿命预测 | 基于BiLSTM双向长短期记忆神经网络的轴承寿命预测附matlab完整代码

默默科研仔的博客 274

对比Vector、ArrayList、LinkedList有何区别?

另外,Java 8 引入了并行排序算法(直接使用 parallelSort 方法),这是为了充分利用现代多核处理器的计算能力,底层实现基于 fork-join 框架(专栏后面会对 fork-join 进行相对详细的介绍),当处理的数据集比较小的时候,差距不明显,甚至还表现差一点;单纯从面试的角度,很多朋友推荐使用一些算法网站如 LeetCode 等,帮助复习和准备面试,但坦白说我并没有刷过这些算法题,这也是仁者见仁智者见智的事情,招聘时我更倾向于考察面试者自身最擅长的东西,免得招到纯面试高手。

TimeFriends 819

C++ int转四字节数组

字节转换

我不是码农的博客~~~ 973

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

算法导论第七章-快速排序-Cpp代码实现

实现了算法导论第七章中的快速排序

YY的博客 860

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

算法导论之栈

栈的结构特点就是先进后出,在一些算法中会用到该数据结构,比如:进行二叉树的层序遍历的时候等。 下面给出栈的代码,代码使用vector存储栈中的元素。 头文件: //name:myStack1.h #ifndef MY_STACK1_H #define MY_STACK1_H #include #include //#define MAX_SIZE_S 1000 using names

醒目的博客 253

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

vector push_back 时间复杂度分析

  《C++程序设计语言》第4部分:标准库,里边写 vector,第一句如下: The STL vector is the default container. Use it unless you have a good reason not to. If your suggested alternative is a list or built-in array, think twice. ...

Bob__yuan的博客 5259

Java核心技术面试精讲第8讲 | 对比Vector、ArrayList、LinkedList有何区别?

我们在日常的工作中,能够高效地管理和操作数据是非常重要的。由于每个编程语言支持的数据结构不尽相同,比如我最早学习的C语言,需要自己实现很多基础数据结构,管理和操作会比较麻烦。相比之下,Java则要方便的多,针对通用场景的需求,Java提供了强大的集合框架,大大提高了开发者的生产力。今天我要问你的是有关集合框架方面的问题,对比Vector、ArrayList、LinkedList有何区别?

牛牛 1205

第8讲 | 对比Vector、ArrayList、LinkedList有何区别?

我们在日常的工作中,能够高效地管理和操作数据是非常重要的。由于每个编程语言支持的数据结构不尽相同,比如我最早学习的 C 语言,需要自己实现很多基础数据结构,管理和操作会比较麻烦。相比之下,Java 则要方便的多,针对通用场景的需求,Java 提供了强大的集合框架,大大提高了开发者的生产力。今天要问你的是有关集合框架方面的问题,对比 Vector、ArrayList、LinkedList 有何区别?

qq_37756660的博客 834

位向量(bit vector)(算法导论第十一章11.1-2)

位向量(bit vector) 位向量(bit vector)是一个仅包含0和1的数组。长度为m的位向量所占空间要比包含m个指针的数组少得多。说明如何用一个位向量来表示一个包含不同元素(无卫星数据)的动态集合。字典操作运行时间应为O(1) (算法导论第十一章11.1-2) //里面的用循环转换了数据 这个在严格要求时间的复杂度下可以移动外部操作 int bit_search(char *array,int k) { if(array[k]) { int result = 1;

外太空的博客 3266

算法导论:第一讲:插入排序和归并排序

从今天开始每天至少一个算法开始写博客 算是自己对自己的一个监督吧!只写代码,不讲原理!有问题自己查,也希望大家能给我改错! 所有代码在VS2010均调试通过!顺便推荐大家一款软件Visual Assist 10.8.2029 (General Release) 插入排序:   归并排序: #include #include using namespace std; vec

wlssing 768

java核心内容——对比Vector、ArrayList、LinkedList有何区别?

java核心内容——对比Vector、ArrayList、LinkedList有何区别?1、典型回答2、考点分析3、知识扩展 1、典型回答 这三者都是实现集合框架中的 List,也就是所谓的有序集合,因此具体功能也比较近似,比如都提供按照位置进行定位、添加或者删除的操作,都提供迭代器以遍历其内容等。但因为具体的设计区别,在行为、性能、线程安全等方面,表现又有很大不同。 Vector 是 Java ...

weixin_38219412的博客 375

算法数据结构C++实现4-计数排序(counting sort)

这里是 Introduction to Algorithm 算法导论书中第八章的计数排序 counting sort, 本专题还是以这本书为主,用c++实现其中最重要的算法。 网上也有很多高手研究了这本书,给出了读书摘要; 本专题的特色就是直接给出程序实现; 这本书的算法还是非常简明易懂的,就是算法分析和一些数学问题会比较难,这些内容还是需要有时间自己慢慢研究的,不过有些比较深入的内容的话,工

靖空间 2606

算法导论—栈和队列

#include #include class UnderflowException { }; using namespace std; template class stack { public: stack(int capacity=100) :array(capacity),top(-1) { } stack(vector &vec) :capacity(100),top

kesonyk的专栏 519

算法导论:c++计数排序

区别于比较排序需要元素进行相互比较,计数排序仅仅通过元素个数确定它在排序结果中的位置。代码实现实在是不想用数组了,这次用方便易操作的vector代替。/*计数排序*/ vector<int> counting_sort(vector<int> array,int k) //k表示数组中最大元素,output为输出 { vector<int> temp(k+1,0);//临时数组,存放个数

imcy的博客 714
上一篇: 五种内存处理基本工具
下一篇: 数据结构篇deque
wangyanphp
博客等级 码龄14年 90粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值