文章目录
- 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类型>名字
这样就定义了一个A类型的顺序表
接口
使用vector容器需要包含头文件(#include)
成员函数
构造成员函数
【constructor】构造函数声明
#include <iostream>
#include <vector>
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构造时的空间大小取决于使用的构造方法。以下是几种常见的构造方法和它们的空间大小:
默认构造方法:使用无参构造函数创建的vector对象将具有默认的初始容量。这个初始容量可以根据实现而有所不同,但通常情况下是0或者一个小的默认值。
区间构造方法:通过指定一个区间来构造vector对象,例如使用两个迭代器指定的开始和结束位置。这种情况下,vector对象的空间大小将根据给定的区间大小来确定。
元素个数构造方法:通过指定一个元素的个数来构造vector对象。在这种情况下,vector对象的空间大小将与指定的元素个数相等。
拷贝构造方法:通过拷贝一个已有的vector对象来构造新的vector对象。在这种情况下,新的vector对象的空间大小将与原始vector对象的空间大小相同。
请注意,vector对象的实际内存使用可能会随着元素的添加和删除而动态变化。当vector的大小超过当前容量时,vector会自动分配更大的内存空间来容纳新的元
析构函数
赋值
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
2.2.1应用
函数调用
用变量接受迭代器
同上;
3.顺序表的访问(增删查检)
3.1operator[]和at
区别是:【】使用assert来报访问是否越界的问题
at使用抛异常来执行;
抛异常:
例子:
【】的例子
at的例子
3.2 front()
std::vector::front
reference front();
const_reference front() const;
返回值:第一个元素的引用
使用示例
很少用;
3.3 back()
std::vector::back
reference back();
const_reference back() const;
返回值:返回最后一个元素的引用;
使用示例
4.vector空间增长问题
4.1 size()和capacity()
4.1.1应用
size的应用
capacity的应用
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
注意(易错)
reserve后使用[]q
4.5shrink_to_fit(缩容)
将容量(capacity)减少到size大小;
尽量少用,
原因:异地缩容;在另一个空间建顺序表;
5.修饰符
5.1push_back(尾插)
5.1.1定义
这里push_back会自动添加size和capacity
5.1.2 应用
二叉树的前序遍历
5.2 pop_back(尾删)
使用例子:
5.3 Insert(指定位置插入)
std::vector::insert
由于参数的位置是迭代器;所以使用find()函数来实现;
解释:在position位置之前添加val
** 注意:这里的postion是迭代器;**
5.4 erase
注意这里的参数也是迭代器;
find(){这个函数可以配套前两个函数使用)
定义:
三个参数:
起始迭代器;中止迭代器;传输的值
注意
这里的参数和返回值都是迭代器;
find ()函数的使用
find函数只有string自己写了,其他容器都是用的是算法库的中的模板版函数(这个模版函数可以被除string以外容器使用)
string容器需要自己写的原因是:string类中需要查找字符串的功能;
5.5swap()
分类:成员函数,全局函数
成员函数是浅拷贝;全局变量是两个指针的交换
5.6 clear()
清理数据(size和指针数组,不清理capacity)
如果在使用clear后还想将capacity改位0时:使用shrink_to_fit()函数将capacity改为0;
这里的输出不知道是12345还是1 2 3 4 5;
vector的使用
应用1
只出现一次的数字
使用异或来解题;
应用2
杨辉三角形
杨辉三角和二维数组的对比:
二维数组
杨氏三角
两者都可以使用下标来访问,但是两者有本质区别:前者是下标的解引用;后者则是函数的调用;
杨氏三角实现leadcode