当前位置:首页 » 《随便一记》 » 正文

C++ STL之vector详解

17 人参与  2023年04月01日 17:37  分类 : 《随便一记》  评论

点击全文阅读


返回主目录

⭐️vector(动态数组)⭐️

1 介绍

1.1 数组初始化方法

vector为可变长数组(动态数组),定义的vector数组可以随时添加数值和删除元素.

在局部函数中开vector数组,是在堆空间里面开的,与开全局变量比较类似,所以经常见到在局部函数中开大容量数组

头文件
#include < vector >

初始化

一维初始化

vector<int>num; //定义了一个名为num的存int数据的一维数组vector<double>num;//定义了一个名为num的存double数据的一维数组vector<node>num;//node是结构体类型

指定长度初始值的初始化

vector<int> v(n);//定义一个长度为n的数组,动态定义,不指定初值默认初值为0vector<int> v(n, 0);//所有的元素均为0//注意:指定数组长度之后(指定长度后的数组就相当于正常的数组了)

初始化中有多个元素

vector<int> a{1, 2, 3, 4, 5};// 数组a中有五个元素

拷贝初始化

vector<int> a(n + 1, 0);vector<int> b(a);//两个数组中的类型必须相同,a和b都是长度为n+1,所有值都为0的数组

二维初始化
定义第一维固定长度为5,第二维可变化的二维数组

vector<int>num[5];//定义可变长二维数组//注意:行是不可变的(只有5行),而列可变可以在指定行添加元素//第一维固定长度为5,第二维长度可以改变

行列均可变

//初始化二维均可变长数组vector<vectot<int> >num;//定义一个行和列均可变的二维数组

行列长度均固定 n + 1m + 1列初始值为0

vector<vector<int> > a(n + 1, vector<int>(m + 1, 0));

c++17或者c++20支持的形式(我也不太清楚?)

vector a(n + 1, vector(m + 1, 0));

1.2 元素的访问方法

//方式一:单个访问,假设num数组中已经有了5个元素cout << num[4] << "\n";  //输出第五个数据//一二维可变数组和普通数组的访问方法一样//方式二:遍历for(int i = 0; i < num.size(); i++)cout << num[i] << " ";//下标范围在[0,num.size()),前开后闭//方式三:智能指针for(auto i : num)cout << i << " ";

2 方法函数

知道了如何定义初始化可变数组,下面就需要知道如何添加,删除,修改数据。

相关方法函数如下:

c指定为数组名称

代码含义
c.front()返回第一个数据 O ( 1 ) O(1) O(1)
c.back()返回最后一个数据 O ( 1 ) O(1) O(1)
c.pop_back()删除最后一个数据 O(1)
c.push_back(element)在尾部加一个数据 O(1)
c.size()返回实际数据个数(unsigned类型) O(1)
c.clear()清除元素个数 O(N),N为元素个数
c.resize(n,v)改变数组大小为n,n个空间数值赋为v,如果没有默认赋值为0
c.insert(it,x)向任意迭代器it插入一个元素x O(N)
例:c.insert(c.begin()+2,-1)将-1插入c[2]的位置
c.erase(first,last)删除[first,last)的所有元素
c.begin()返回首元素的迭代器(通俗来说就是地址)
c.end()返回最后一个元素后一个位置的迭代器(地址)
c.empty()判断是否为空,为空返回真,反之返回假

注意: end()返回的是最后一个元素的后一个位置的地址,不是最后一个元素的地址,所有容器均是如此

以上 O(n),O(1)说的是时间复杂度

3 注意点

3.1. 排序

使用sort排序要: sort(c.begin(),c.end());

对所有元素进行排序,如果要对指定区间进行排序,可以对sort()里面的参数进行加减改动。

3.2. 访问

数组访问:

上面有简单的访问演示,下面进行扩充并复习

下标法: 和普通数组一样

注意:一维数组的下标是从 0 0 0到 v . s i z e ( ) − 1 v.size()-1 v.size()−1,访问之外的数可能会出错

迭代器法: 类似指针一样的访问 ,首先需要声明迭代器变量,和声明指针变量一样,可以根据代码进行理解(附有注释)。

代码如下:

vector<int> vi; //定义一个vi数组vector<int>::iterator it = vi.begin();//声明一个迭代器指向vi的初始位置

vector数组访问相关代码:

2.1.下标访问:

//添加元素for(int i = 0; i < 5; i++)vi.push_back(i);//下标访问 for(int i = 0; i < 5; i++)cout << vi[i] << " ";cout << "\n";

2.2.迭代器访问:

//迭代器访问vector<int>::iterator it;   //相当于声明了一个迭代器类型的变量it//通俗来说就是声明了一个指针变量//方式一:vector<int>::iterator it = vi.begin(); for(int i = 0; i < 5; i++)cout << *(it + i) << " ";cout << "\n";//方式二:vector<int>::iterator it;for(it = vi.begin(); it != vi.end();it ++)cout << *it << " ";//vi.end()指向尾元素地址的下一个地址

2.3.智能指针:

只能遍历完数组,如果要指定的内容进行遍历,需要另选方法。
auto 能够自动识别类型。

vector<int> v;v.push_back(12);v.push_back(241);for( auto i : v) cout << i << " "; // 12 241

综上:

vi[i]*(vi.begin() + i) 等价说明:只有vectorstring的stl容器支持*(it + i)的元素访问

string的讲解在后续章节会有讲述


点击全文阅读


本文链接:http://zhangshiyu.com/post/57843.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1