STL之vector

ops/2024/9/22 18:51:47/

vector简单介绍

  1. vector是一个STL的一个容器,行为类似于变成数组,也就是存储空间是连续的,同时其空间大小又是动态可变的。

  2. vector访问元素的效率很高可以通过下标直接访问,但是其占用的空间很多,插入删除元素的效率很低。

  3. 使用vector时记得包含头文件

    #include <vector>
    

vector的构造函数

vector本质是类模板,可以存储任何类型的数据。数组在声明前需要加上数据类型,而vector则通过模板参量设定类型。比如,声明一个int型的vector数组。

vector<int> arr1;								//一个空数组
vector<int> arr2 {1, 2, 3, 4, 5};				//包含1、2、3、4、5五个变量
vector<int> arr3(4);							//开辟4个空间,值默认为0
vector<int> arr4(5, 3);							//5个值为3的数组
vector<int> arr5(arr4);							//将arr4的所有值复制进去,和arr4一样
vector<int> arr6(arr4.begin(), arr4.end());		//将arr4的值从头开始到尾复制
vector<int> arr7(arr4.rbegin(), arr4.rend());	//将arr4的值从尾到头复

也就是说想要创建一个vector可以通过

  1. 初始化列表构造如arr2

  2. 含有n个元素的vetcor如arr3

  3. 含有n元素且值为value如arr4

  4. 拷贝构造如arr5

  5. 通过迭代器区间构造如arr6和arr7

vector的容量

这里主要介绍其中的resize和reserve。

vector的容量包括:size,capacity,empty,resize和reserve。

  • size顾名思义就是得到数据的个数
  • capacity则是得到容量大小
  • empty是判断是否为空
  • resize是改变size,reserve是改变capacity这也是两者最根本的区别

reserve主要是用来预留空间在已知需要多少空间的情况下避免不必要的扩容

void resize(size_type n, value_type val = value_type());- 如果n<当前容器的size,则将元素减少到前n个,移除多余的元素(并销毁)
- 如果n>当前容器的size,则在容器中追加元素,如果val指定了,则追加的元素为val的拷贝,否则,默认初始化
- 如果n>当前容器容量,内存会自动重新分配void reserve(size_type n)- 如果n>容器的当前capacity,该函数会使得容器重新分配内存使capacity达到n
- 任何其他情况,该函数调用不会导致内存重新分配,并且容器的capacity不会改变
- 该函数不会影响向量的size而且不会改变任何元素

resize是改变size并且创建对象

1、resize(n) 调整容器的长度大小,使其能容纳n个元素。如果n小于容器的当前的size,则删除多出来的元素。否则,添加采用值初始化的元素。2、 resize(n,t)多一个参数t,将所有新添加的元素初始化为t。

vector的元素访问以及遍历

  1. 通过[]下标访问

    for (int i = 0; i < arr.size(); i++)
    {cout << arr[i] << endl;
  2. 范围for

for (auto num : arr)
{cout << num << endl;
}

3.迭代器访问

  • 通过迭代器访问从begin()到end(),需要定义iterator,当然可以用auto替代。
  • begin()表示第一个元素,而end()不是最后一个元素,end()是最后一个元素的前一个位置
  • rebegin()返回的是最后一个元素,reend()则返回的是第一个元素的前一个元素
//迭代器:vector<int>::iterator
for (vector<int>::iterator it = arr.begin(); it != arr.end(); it++)
{cout << *it << endl;
}
//迭代器:vector<int>::reverse_iterator
for (vector<int>::reverse_iterator it = arr.rbegin(); it != arr.rend(); it++)
{cout << *it << endl;
}

vector使用时的注意事项

1.迭代器失效

vector的每一次扩容都不是在原地扩容,而是新开辟一块儿空间后将原先的数据拷贝到新空间

当我们使用insert()插入新的元素时

vector<int> arr;
arr.push_back(1);
arr.push_back(2);
arr.push_back(3);
arr.push_back(4);
arr.push_back(5);
auto pos = find(arr.begin(),arr.end(),3);
arr.insert(pos,30);
arr.insert(pos,40);

此时就会出现问题
在这里插入图片描述

在使用erase()时也会有问题

vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(4);
v.push_back(6);for (auto e : v)
{cout << e << " ";
}
cout << endl;
auto it = v.begin();
while (it != v.end())
{if (*it % 2 == 0){it = v.erase(it);}++it;
}for (auto e : v)
{cout << e << " ";
}
cout << endl;

这段代码想要删除所有的偶数

可是在使用erase()时它返回的是被删除元素的下一个位置的迭代器

那么解决方法也很简单

  1. 对于insert来说

在pos位置使用一次insert后
不要再次直接访问pos迭代器
一定要更新了pos之后再去访问!

  1. 对于erase来说

删除后不用再++迭代器
只用在没删除的时候再++

2深浅拷贝问题

拷贝vector时不要使用memcpy这是一种浅拷贝即只是拷贝了相同的数据并没有开辟新的空间浅拷贝是按字节拷贝,会导致拷贝后迭代器指向同一块空间。

对于insert来说`**

在pos位置使用一次insert后
不要再次直接访问pos迭代器
一定要更新了pos之后再去访问!

  1. 对于erase来说

删除后不用再++迭代器
只用在没删除的时候再++


http://www.ppmy.cn/ops/114373.html

相关文章

影刀RPA实战:网页爬虫之苦瓜书籍数据

书籍常常被视为心灵的慰藉&#xff0c;因为它们能够在不同的层面上为人们提供支持和安慰。 1. 书籍对我们的重要性 书籍是人类知识的载体&#xff0c;也是智慧的结晶。它们不仅是学习的工具&#xff0c;更是人类心灵的慰藉。在忙碌的生活中&#xff0c;书籍能够提供知识、启发…

数据结构之结构体

1.求 sizeof(name1)&#xff1f;(晟安信息) struct name1{ char str; //1 short x;//2 int num;//4 }; 答案&#xff1a;8字节 2.(电工时代) typedef struct _a { char c1;//1 long i;//8 char c2;//1 double f;//8 }a; typedef struct _b { char c1;//1 char c2;//1 long i;//…

Mac 搭建仓颉语言开发环境(Cangjie SDK)

文章目录 仓颉编程语言通用版本SDK Beta试用报名仓颉语言文档注册 GitCode登录 GitCode 下载 Cangjie SDK配置环境变量VSCode 插件VSCode 创建项目 仓颉编程语言通用版本SDK Beta试用报名 https://wj.qq.com/s2/14870499/c76f/ 仓颉语言文档 https://developer.huawei.com/c…

Nginx 跨域 + 无法设置 Cookie 解决办法

今天来分享一下关于项目部署上线时怎么解决跨域问题!!! 首先感谢一下大佬的方法,才让这个困扰我很久的问题得以解决!!! 这也是我请教大佬才解决的问题,大佬和我说,这是他耗费两周才解决的问题,我这也是属于前人栽树后人乘凉了,嘿嘿嘿!!! 前端问题 前端没有携带 cookie 导致后端…

信息安全数学基础(15)欧拉定理

前言 欧拉定理是数论中的一个重要定理&#xff0c;它建立了模运算下指数与模的互质关系。这个定理在密码学、信息安全等领域有着广泛的应用&#xff0c;特别是在公钥密码体制&#xff08;如RSA加密算法&#xff09;中。 一、表述 设 n 是一个正整数&#xff0c;a 是一个与 n 互…

安全区域边界等保测评

1.边界防护 应保证跨越边界的访问和数据流通过边界设备提供的受控接口进行通信。 [测评方法] 1)应核查在网络边界处是否部署访问控制设备;网闸和防火墙2)应核查设备配置信息是否指定端口进行跨越边界的网络通信,指定端口是否配置并启用了安全策略acl 3)应采用其他技术手…

【算法题】63. 不同路径 II-力扣(LeetCode)-”如果起点有障碍物,那么便到不了终点“

【算法题】63. 不同路径 II-力扣(LeetCode)-”如果起点有障碍物&#xff0c;那么便到不了终点“ 1.题目 下方是力扣官方题目的地址 63. 不同路径 II 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下…

nginx 文件尺寸过大解决方案

http { # 其他配置... client_max_body_size 1M; # 这是默认值&#xff0c;也可以在 server 块中覆盖 # 其他配置... } server { listen 80; server_name shop.yanmishu.cn; # 如果有这个配置&#xff0c;则会覆盖 http 块中的设置 …