C++容器——vector

本文详细介绍了C++STL中的vector容器,包括其与普通数组的区别,动态调整大小、内存管理、初始化方法、丰富的接口以及元素操作,如添加、删除和数据存取。特别强调了vector在迭代器支持下的高效性和安全性。
摘要由CSDN通过智能技术生成

目录

基本概念:

与普通数值的区别:

大小调整:

内存管理:

初始化与构造:

接口丰富性:

传递给函数:

效率:

使用(迭代器):

定义和初始化:

控制元素操作:

添加元素

删除元素

容器操作:  

数据存取:


基本概念:

vector容器功能与数组的功能类似!

提供了动态数组的功能,即大小可以自动调整的数组

使用vector容器需加头文件          #include<vector>


与普通数值的区别:

大小调整:

普通数组:大小固定,一旦声明就需要指定其大小,并且之后无法改变。

vector容器:动态数组,可以在运行时自动调整大小。当元素数量超过当前容量时,vector会自动分配更多的内存以容纳更多元素。自动分配是动态扩展!

动态扩展:不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝到新空间,释放原空间

内存管理:

普通数组:需要手动分配和释放数组所占用的内存,容易引发内存泄漏或越界错误。

vector容器:自动管理内存,包括分配、扩展和释放内存,减少负担,提高了代码的安全性。

初始化与构造:

普通数组:初始化时必须显式给出所有元素的值,或者默认初始化(例如,整型数组默认初始化为0)。

vector容器:提供多种构造方法,如默认构造、用特定数量的元素初始化、用区间内的元素初始化等。

接口丰富性:

普通数组:操作相对有限,主要依赖下标访问和指针算术。

vector容器:作为STL的一部分,提供了丰富的成员函数,如push_back, pop_back, insert, erase, size, empty等,便于元素的添加、删除和查询。

传递给函数:

普通数组:作为函数参数时,通常传递数组的指针(数组名),这使得难以确定数组的大小,且不能直接通过引用修改数组大小。

vector容器:可以按值传递、按引用传递或使用迭代器,更安全且功能更全面,尤其是当需要在函数内部修改容器时,传递引用避免了拷贝整个容器。

效率:

普通数组:由于其固定性和连续性,在已知大小且不需调整的情形下,访问速度可能更快,尤其是在循环遍历等场景。

 vector容器:在某些情况下(如尾部插入和删除)由于连续内存布局可以非常高效,但当需要在中间插入或删除元素时,可能涉及元素的大规模移动。


使用(迭代器):

定义和初始化:

定义:

vector <T> vectorname ;
//实质是类模板

解释:

T     数据类型

vectorname  为vector容器名

举例子:

#include<iostream>
#include<vector>
int main()
{
	std::vector <int> v;
	return 0;
}

初始化:

通过举例子可以很清晰明了的看出

#include<iostream>
#include<vector>
int main()
{
	//列表初始化
	std::vector <int> v1{1,2,3,4} ;
	std::vector <int> v2 = {1,2,3,4};

	//指定大小(默认初始化为0)
	std::vector <int> v3(4);
	
	//指定大小初始化(指定v4有3个元素都为1)
	std::vector <int> v4(3, 1);
	
	//拷贝初始化
	std::vector <int> v5 (v4);
	std::vector <int> v6 { v4 };
	std::vector <int> v7 = v4;
	std::vector <int> v8(v1.rbegin(), v1.rend());//区间拷贝,从末尾到首的拷贝

	return 0;
}

控制元素操作:

添加元素

使用push_back(a)在末尾添加元素a

使用insert(a,b)在指定位置a插入b元素(a为迭代器)

使用insert(a,b,c)在指定位置a插入b个c元素(a为迭代器)

使用emplace(a,b)在指定位置a插入元素b(就地构造)(a为迭代器)

使用emplace_back(a)在末尾添加元素a(就地构造)

[就地构造]:是一种直接在最终存储位置创建对象的技术。这种技术可以避免额外的复制或移动操作,从而提高效率和资源利用率。

删除元素

使用pop_back()删除最后一个元素

使用erase(a)删除指定位置a的元素(a为迭代器)

使用erase(a,b)删除指定范围的元素(a与b为迭代器)

使用clear()删除所有元素

使用resize(int a)减少大小来删除元素

容器操作:  

empty():

此函数用于判断容器是否为空。如果容器为空,则返回true,否则返回false。

size():

此函数返回容器中实际元素的数量,也就是容器的大小。

capacity():

此函数返回当前容器的容量,即在不重新分配内存的情况下,容器最多能容纳多少元素。这与当前元素的实际数量(size)可能不同。

resize(int num):

此函数用于重新指定容器的大小为num。

如果新的大小大于当前大小,容器会被填充默认值初始化的新元素直到达到num(对于内置类型如int,默认值通常是0)。

如果新的大小小于当前大小,容器尾部的元素会被移除,以减小容器的大小到num。

resize(int num, int elem):

这个是重载版本的resize同样用于调整容器大小到num,但当容器需要扩展时,新增的位置会使用指定的elem值进行填充,而不是默认值。

swap(n):

交换当前容器和容器n

数据存取:

[n]: 返回对容器中位置为 n 的元素的引用。(普通数组的访问数据方式在vector容器中也适用)

at(n): 返回对容器中位置为 n 的元素的引用,并进行边界检查。

front(): 返回对容器中第一个元素的引用。

back(): 返回对容器中最后一个元素的引用。

  • 27
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值