array和vector

vector

基本用法

  • 头文件:
#include <vector>
  • 初始化:
vector<int>  ratings;   //创建一个空的vector数组
vector<int> ratings(5);  //(数目),默认初始化为0
vector<int> ratings(5, 2);  //(数目,值)
vector<int> nums {ratings.begin(), ratings.begin()+5};  //用ratings前5个元素构造nums
  • 插入与删除:
  1. push_backpop_back
ratings.push_back(10);  //末尾插入10
ratings.pop_back();   //删除末尾元素
  1. eraseinsert
    (1)插入操作:
  1. 新插入的元素放在插入位置之前
vector<int> nums1 {1, 2, 3, 4, 5};
vector<int> nums2 {6, 7, 8, 9, 10};
nums1.insert(nums1.end(), nums2.begin(), nums2.end()); //插入区间
//nums1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
nums1.insert(nums1.begin(), 10);  //插入单个元素
//nums1 = {10, 1, 2, 3, 4, 5}

(2)删除操作

nums1.erase(nums.begin(), nums.begin() + 2); // [nums.begin(), nums.begin()+2)前开后闭区间
auto iter = nums.begin() + 1;
nums1.erase(iter);  //删除单个元素
  • sizecapcity:
  1. size表示vector中有多少个元素
  2. capacity表示容量大小(多大内存)
vector<int> nums = { 1, 2, 3, 4, 5 };
cout << nums.size() << endl;   //5
cout << nums.capacity() << endl;  //5
nums.push_back(6);
cout << nums.size() << endl;  //6
cout << nums.capacity() << endl;  //7
  • 遍历:
  1. 利用迭代器:
for(auto pd = scores.begin(); pd != scores.end(); pd++)
	cout << *pd << endl;
  1. 基于范围的for循环:
for(int x : nums)
	cout<<x<<endl;

基本原理

  1. vector动态增长的过程:重新分配内存空间拷贝原空间释放原空间,动态增长的过程会降低vector的效率
    (1)空的vector对象,sizecapacity都为0
    (2)空间不足时,新分配的空间大小为原空间的2倍,若2倍不够,则分配新的空间大小为需要的空间大小
  2. reserve(n)预先分配一块大小为n的内存,空间为满的情况下,不会引起重新分配内存空间,提升了效率
  3. 若当前vectorcapacity大于resize的参数大小时,resize只会改变容器的数目,未改变容器的大小

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • vectorlist的区别:
  1. vector是动态数组,拥有连续的存储空间,list是双向链表,拥有的空间不连续
  2. 随机存取: vector可以进行高效地随机存取,时间复杂度O(1),list不提供随机访问,需要遍历,时间复杂度O(n)
  3. 插入删除:vector插入删除操作会造成内存的拷贝时间复杂度O(n),但在vector尾部插入效率高,list插入和删除效率高,时间复杂度O(1)
  4. 迭代器:vector的迭代器在使用之后可能会失效,而list的迭代器在使用之后还可以继续使用
  5. 额外开销: 由于list是双向链表,需要维护额外的指针来寻找下一个和前一个节点,因此开销大,而vector无额外的开销

在这里插入图片描述

  • 空间释放:
  1. vector占用的空间只曾不减,即使使用eraseclear删除或清空元素,内存仍然保存,所有内存空间是在vector析构是才会被释放

在这里插入图片描述

array

基本用法

array<int, 10> m_arr{ 1, 2, 3, 4, 5, 6, 7, 8}; //未初始化的元素默认初始化为0(和C数组类似)
m_arr.size();   //10 表示容量大小
m_arr.front();  //1
m_arr.back();   //0
m_arr.data();   //数组所在的地址

基本原理

  • vector和array有啥子区别?
  1. 首先vector和array比较相似,都是连续存储的,使用方法也基本一样都可以用中括号来访问元素,两者的唯一区别就在空间的运用的灵活性上:
    (1)array是静态空间,定义的时候就要去指定出大小,而且不能改变,基本和C++内置的数组一样
    (2)vector是动态的,不需要事先指定你要存储的元素的数据,当然你指定了也可以,但是无论你指定没指定,vector会自动扩容来容纳新的元素
数组(array)和向量(vector)是在C语言中常用的数据结构,用于存储一组相同类型的元素。 数组是一种静态数据结构,它在声明时需要指定大小,并且大小不可改变。数组的元素在内存中是连续存储的,可以通过索引访问和修改特定位置的元素。例如,以下是一个包含5个整数的数组的声明和初始化示例: ```c int myArray[5] = {1, 2, 3, 4, 5}; ``` 向量是一种动态数据结构,它可以动态地增加或减少元素的个数。向量是通过动态分配内存来实现的,因此可以根据需要增加或删除元素。向量提供了许多方便的方法来操作和管理元素,如添加、删除、插入等。以下是使用向量进行元素添加和访问的示例: ```c #include <stdio.h> #include <stdlib.h> #include <vector.h> int main() { vector<int> myVector; // 添加元素 myVector.push_back(1); myVector.push_back(2); myVector.push_back(3); // 访问元素 printf("第一个元素:%d\n", myVector[0]); printf("第二个元素:%d\n", myVector[1]); printf("第三个元素:%d\n", myVector[2]); return 0; } ``` 需要注意的是,向量是C++标准模板库(STL)中的一部分,因此在使用向量时需要包含相应的头文件,并且编译时需要使用C++编译器。 总结来说,数组是静态的、固定大小的数据结构,而向量是动态的、可以改变大小的数据结构。根据具体的需求选择适合的数据结构进行使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_46427273

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值