vector类(顺序表)

文章目录

    • 1.定义:
    • 接口
    • 成员函数
      • 构造成员函数
      • 析构函数
      • 赋值
    • 2.迭代器
      • 2.1begin()和end()重点
        • 2.1.1应用
          • 2.1.1.1函数调用
        • 2.1.1.2用变量接受迭代器
      • 2.2rbegin()和rend()
        • 2.2.1应用
    • 3.顺序表的访问(增删查检)
      • 3.1operator[]和at
      • 3.2 front()
      • 3.3 back()
    • 4.vector空间增长问题
      • 4.1 size()和capacity()
        • 4.1.1应用
      • vector的扩容机制
      • 4.2 maxsize
      • 4.3 resize()和reserve
      • 4.5shrink_to_fit(缩容)
    • 5.修饰符
      • 5.1push_back(尾插)
        • 5.1.1定义
        • 5.1.2 应用
      • 5.2 pop_back(尾删)
      • 5.3 Insert(指定位置插入)
      • 5.4 erase
      • find(){这个函数可以配套前两个函数使用)
      • 5.5swap()
      • 5.6 clear()
    • vector的使用
      • 应用1
      • 应用2
        • 杨辉三角和二维数组的对比:
          • 二维数组
          • 杨氏三角

1.定义:

在这里插入图片描述
这里顺序表的定义需要示例化:
vector名字
这样就定义了一个A类型的顺序表

接口

vector类(顺序表)_第1张图片
使用vector容器需要包含头文件(#include)

成员函数

构造成员函数

【constructor】构造函数声明
vector类(顺序表)_第2张图片

#include 
#include 
using namespace std;
 
void test() {
	vector<int> s1;//无参构造
	vector<int> s2(5, 1);//构造并初始化5个1
	vector<int> s3(s2);//拷贝构造
	vector<int> s4(s2.begin(), s2.end());//迭代器构造(拷贝s2)
}
 
int main() {
	test();
	return 0;
}

vector类(顺序表)_第3张图片

vector构造时的空间大小取决于使用的构造方法。以下是几种常见的构造方法和它们的空间大小:
默认构造方法:使用无参构造函数创建的vector对象将具有默认的初始容量。这个初始容量可以根据实现而有所不同,但通常情况下是0或者一个小的默认值。
区间构造方法:通过指定一个区间来构造vector对象,例如使用两个迭代器指定的开始和结束位置。这种情况下,vector对象的空间大小将根据给定的区间大小来确定。
元素个数构造方法:通过指定一个元素的个数来构造vector对象。在这种情况下,vector对象的空间大小将与指定的元素个数相等。
拷贝构造方法:通过拷贝一个已有的vector对象来构造新的vector对象。在这种情况下,新的vector对象的空间大小将与原始vector对象的空间大小相同。
请注意,vector对象的实际内存使用可能会随着元素的添加和删除而动态变化。当vector的大小超过当前容量时,vector会自动分配更大的内存空间来容纳新的元

析构函数

在这里插入图片描述

赋值

vector类(顺序表)_第4张图片

2.迭代器

2.1begin()和end()重点

获取第一个数据位置的iterator/const_iterator,获取最后一个数据的下一个位置的iterator/const_iterator

2.1.1应用
2.1.1.1函数调用

在这里插入图片描述

2.1.1.2用变量接受迭代器

变量的定义:
vector::iterator it=v4.begin();
顺序表类型::迭代器类型 变量
在这里插入图片描述
优质写法:使用auto
应用:
auto it =v4.begin();

2.2rbegin()和rend()

获取最后一个数据位置的reverse_iterator,获取第一个数据前一个位置的reverse_iterator

vector类(顺序表)_第5张图片

2.2.1应用

函数调用
在这里插入图片描述
用变量接受迭代器
同上;

3.顺序表的访问(增删查检)

3.1operator[]和at

区别是:【】使用assert来报访问是否越界的问题
at使用抛异常来执行;
抛异常
例子:
vector类(顺序表)_第6张图片
【】的例子
vector类(顺序表)_第7张图片
at的例子
在这里插入图片描述

3.2 front()

std::vector::front
reference front();
const_reference front() const;

返回值:第一个元素的引用
使用示例
vector类(顺序表)_第8张图片
很少用;

3.3 back()

std::vector::back
reference back();
const_reference back() const;

返回值:返回最后一个元素的引用;
使用示例
vector类(顺序表)_第9张图片

4.vector空间增长问题

4.1 size()和capacity()

4.1.1应用

size的应用
vector类(顺序表)_第10张图片
capacity的应用
vector类(顺序表)_第11张图片

vector的扩容机制

// 测试vector的默认扩容机制
void TestVectorExpand()
{
 size_t sz;
 vector<int> v;
 sz = v.capacity();
 cout << "making v grow:\n";
 for (int i = 0; i < 100; ++i) 
 {
 v.push_back(i);
 if (sz != v.capacity()) 
 {
 sz = v.capacity();
 cout << "capacity changed: " << sz << '\n';
 }
 }
}
vs:运行结果:vs下使用的STL基本是按照1.5倍方式扩容
making foo grow:
capacity changed: 1
capacity changed: 2
capacity changed: 3
capacity changed: 4
capacity changed: 6
capacity changed: 9
capacity changed: 13
capacity changed: 19
capacity changed: 28
capacity changed: 42
capacity changed: 63
capacity changed: 94
capacity changed: 141
g++运行结果:linux下使用的STL基本是按照2倍方式扩容
making foo grow:
capacity changed: 1
capacity changed: 2
capacity changed: 4
capacity changed: 8
capacity changed: 16
capacity changed: 32
capacity changed: 64
capacity changed: 128

4.2 maxsize

容器可以开的最大空间。

4.3 resize()和reserve

vector类(顺序表)_第12张图片
注意(易错)
reserve后使用[]q
vector类(顺序表)_第13张图片

4.5shrink_to_fit(缩容)

将容量(capacity)减少到size大小;
尽量少用
原因:异地缩容;在另一个空间建顺序表;

5.修饰符

5.1push_back(尾插)

5.1.1定义

vector类(顺序表)_第14张图片
这里push_back会自动添加size和capacity

5.1.2 应用

二叉树的前序遍历
vector类(顺序表)_第15张图片

5.2 pop_back(尾删)

使用例子:
在这里插入图片描述

5.3 Insert(指定位置插入)

std::vector::insert

在这里插入图片描述
由于参数的位置是迭代器;所以使用find()函数来实现;
vector类(顺序表)_第16张图片
解释:在position位置之前添加val
** 注意:这里的postion是迭代器;**

5.4 erase

vector类(顺序表)_第17张图片
注意这里的参数也是迭代器;

find(){这个函数可以配套前两个函数使用)

定义
在这里插入图片描述
三个参数:
起始迭代器;中止迭代器;传输的值
注意
这里的参数和返回值都是迭代器;
find ()函数的使用
find函数只有string自己写了,其他容器都是用的是算法库的中的模板版函数(这个模版函数可以被除string以外容器使用)
string容器需要自己写的原因是:string类中需要查找字符串的功能;

5.5swap()

分类:成员函数,全局函数
成员函数是浅拷贝;全局变量是两个指针的交换
在这里插入图片描述
在这里插入图片描述

5.6 clear()

清理数据(size和指针数组,不清理capacity)
如果在使用clear后还想将capacity改位0时:使用shrink_to_fit()函数将capacity改为0;
vector类(顺序表)_第18张图片
这里的输出不知道是12345还是1 2 3 4 5;

vector的使用

应用1

只出现一次的数字
使用异或来解题;

应用2

杨辉三角形
vector类(顺序表)_第19张图片

杨辉三角和二维数组的对比:
二维数组

vector类(顺序表)_第20张图片

杨氏三角

vector类(顺序表)_第21张图片
两者都可以使用下标来访问,但是两者有本质区别:前者是下标的解引用;后者则是函数的调用;
杨氏三角实现leadcode

你可能感兴趣的:(c++)