<STL - 1> vector(动态数组) 和 arr数组

1.特点

vector 常叫做动态数组 :

可以根据需要动态调整大小,不需要在创建时指定固定的大小

它内部使用动态分配的内存来存储元素,当需要添加或删除元素时,会自动进行内存管理
当然也可以手动

vector 可以进行随机访问 :

支持通过 下标(索引) 快速访问元素,即支持随机访问.通过下标访问元素的时间复杂度为O(1)

2.常用方法

一. 默认构建数组

 std::vector <T> 数组名; // 构建了一个名为**数组名**的数组

二. 常用的初始化

①. 指定值初始化

  std::vector<int> Vector(5, 10);  // 创建一个包含5个10的数组

②. 使用数组初始化:

  int arr[] = {1, 2, 3, 4, 5};
  std::vector<int> Vector(arr, arr + sizeof(arr) /             sizeof(int));  // 使用数组中的元素来初始化向量

③. 范围初始化:

直接使用中括号进行数组的初始化

④. 继承初始化:

  std::vector<int> fatherVector = {1, 2, 3, 4, 5};
  std::vector<int> sonVector(originalVector);  // 使用另一个数组

的元素进行初始化

三. 大小的改变

常用大小的函数

  1. size(): 返回数组中元素的个数

  2. empty():检查数组是否为空,如果数组为空则返回true,否则返回false

  3. resize():调整向量的大小,可以增加或减少数组的元素数量。

std::vector<int> Vector = {1, 2, 3};
    Vector.resize(5); // 增加数组的大小为5,默认初始化新增的元素, 在vs中自动将没有元素的新增加空间赋值为0
    
    Vector.resize(2); // 减少数组的大小为2,多余的元素会被删除

四. 元素的访问

  1. vector支持随机访问元素,可以使用下标索引的方法, 常使用重载的中括号[ ]

  2. 或者使用 " * " 解引用迭代器,得到指定的元素

  3. 使用at()函数:类似于[]运算符,但提供了边界检查。如果索引超出范围,会抛出std::out_of_range异常 //更严谨的访问函数

  4. 使用 front()back() 函数:但只能访问第一个元素和最后一个元素,并返回该元素

五. 插入与删除

在内存空间上,vector是连续的一段内存上存储数据,在增加元素时,会自动增加内存.
但是可能会遇到连续内存后的内存被占用的情况,所以会整体的迁移

①. push_back()

向容器末尾插入一个元素。该函数将元素添加到容器的末尾,并增加容器的大小

②. insert()

在指定位置插入一个或多个元素。该函数接受两个迭代器参数,第一个参数表示要插入的位置,第二个参数表示要插入的元素的范围

以下为代码示例

std::vector<int> Vector = {1, 2, 3};

auto it = Vector.begin() + 1; // 插入在第二个位置

Vector.insert(it, 4); // 在位置it处插入值为4的元素后 Vector 变为 {1, 4, 2, 3}



insert(position, count, value) :在指定位置插入 count 个值为 value 的元素
Vector.insert(it, 3, 4); // 在位置it处插入3个值为4的元素 Vector 变为 {1, 4, 4, 4, 4, 2, 3}



std::vector<int> aVector = {4, 5, 6};

Vector.insert ( it , aVector.begin() , aVector.end() ); // 在位置it处插入aVector的所有元素, Vector 变为 {1, 4, 5, 6, 4, 4, 4, 4, 2, 3}

 

③. pop_back()

删除容器末尾的元素。该函数将容器的大小减小一个单位。

④. erase()

删除指定位置或指定范围内的一个或多个元素.该函数接受一个迭代器参数,表示要删除的元素位置,或者两个迭代器参数,表示要删除的元素范围

注意 : erase() 的返回值

返回值为迭代器

. 单个元素删除:
语法 : erase(position)
如果删除的是单个元素,则返回指向被删除元素之后的元素的迭代器,如果删除的是最后一个元素,则返回容器的end()迭代器

. 范围删除:
语法 : erase(first, last)
如果删除的是一个范围内的元素,则返回指向范围中第一个被删除元素之后的元素的迭代器,如果删除的范围是整个容器,则返回容器的end()迭代器

. 无返回值: 如果使用erase()函数时没有使用返回值来接收,那么函数将不返回任何内容,只会删除指定的元素

六. 元素交换

语法:
swap(other):交换当前 vector另一个 vector 的内容。

3.vector中的迭代器的使用与注意点

容器中的迭代器是一个类中类

一. 构建迭代器的语法 : vector::iterator 迭代器名;

二. 迭代器常用的函数

begin():返回指向 vector 第一个元素的迭代器

end():返回指向 vector 最后一个元素之后位置的迭代器

三. 迭代器的操作符

Vector的迭代器支持一系列操作
例如: 解引用 ( * it ) 获取当前迭代器指向的元素,自增 (++it) 将迭代器移动到下一个位置,自减 (–it) 将迭代器移动到上一个位置,还可以使用关系运算符进行比较(it1 == it2,it1 != it2)

四. 使用迭代器删除元素

当Vector发生插入或删除操作时,迭代器可能会失效, 因此, 在插入或删除元素后,必须谨慎使用先前的迭代器
, 通常使用迭代器接收insert返回的新的迭代器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值