[C++ STL] vector 详解
标题:[C++ STL] vector 详解
@水墨不写bug
目录
一、背景
二、vector简介
三、vector的接口介绍
(1)默认成员函数接口
i,构造函数(constructor)
ii,析构函数(destructor)
iii,拷贝构造
iv,赋值重载
(2)迭代器接口
(3)容量接口
i,size()
ii,max_size()
iii,resize()
iv,capacity()
v,empty()
vi,reserve()
vii,shrink_to_fit()
(4)元素访问接口
i,operator[]
ii,at()
iii,front()
iv,back()
(5)修改接口
i,push_back()
ii,pop_back()
iii,insert()
iv,erase()
v,swap()
vi,clear()
正文开始:
一、背景
我们在学习C语言时就渴望过一种可以自动扩容的数组。尽管C99标准引入了变长数组:
变长数组
变长数组是C99标准新增的特性,它允许在运行时动态地指定数组的长度。与传统的静态数组不同,变长数组的长度可以在程序运行时确定,而不是在编译时确定。
但是变长数组不是真正的可以随意扩容的容器:因为在运行时,变长数组的长度只能确定一次。一旦变长数组的长度确定,就无法再次改变了!
这也是C语言的痛点,为了实现随意扩容的功能,我们可以实现一个动态顺序表(Dynamic Sequence List):
可变长的顺序表(Dynamic Sequence List)
是一种能够动态调整存储空间大小的顺序表。它的大小是可以根据需要进行动态扩展或缩小的,不需要在初始化时指定固定的容量。
实现可变长顺序表的方式有多种,其中一种常见的方式是使用动态数组。动态数组是在内存中分配一块连续的存储空间来存储元素,当元素个数超过当前分配的空间大小时,会重新分配更大的空间,并将原有的元素复制到新的空间中,然后释放原有的空间。
但是每次在使用前,都要实现一个顺序表太麻烦了,用C语言实现一个顺序表动辄就几百行,这样不断重复“造轮子”的行为导致开发十分低效。在这样的背景下,C++中引入了STL:
STL(Standard Template Library)
是C++标准库中的一个重要组成部分,提供了一系列的模板类和算法,用于处理常见的数据结构和算法问题。STL包括了容器(Containers)、迭代器(Iterators)、算法(Algorithms)和函数对象(Function Objects)等组件,提供了丰富的数据结构和算法操作。
其中的容器,就是帮助我们解决问题的组件。本文讲解的vector就是容器中的非常常用常见的一个。
二、vector简介
vector是STL中的一个容器,实现了动态数组的功能。它可以存储任意类型的元素,并提供了一系列的操作函数,如插入、删除、访问等。
vector的特点包括:
- 动态大小:vector的大小可以根据需要进行动态调整,可以随时增加或减少元素的数量。
- 连续存储:vector的元素在内存中是连续存储的,可以通过下标快速访问元素。
- 头部插入删除效率较低:由于在头部插入或删除元素时需要进行大块内存的复制或移动,导致效率较低。
- 随机访问效率高:由于元素的连续存储,可以通过下标直接访问任意位置的元素。
三、vector的接口介绍
由于在实际应用中,vector的一些接口并不常用,所以本介绍尽量在完整的基础上简洁。
(1)默认成员函数接口
在正式开始介绍之前,我们先认识一个之前已经见过的关键字:
explicit:
在C++中,explicit 是一个关键字,用于防止类构造函数进行隐式类型转换。当你有一个类,并且这个类有一个可以从其他类型隐式转换的构造函数时,你可能会在无意中创建该类的对象,而不是你原本想要的。使用 explicit 关键字可以确保这种转换是显式的,从而避免潜在的错误。
class MyClass {
public:
explicit MyClass(int value) {
// ...
}
};
void foo(MyClass obj) {
// ...
}
int main() {
// 下面的代码会因为 MyClass 的构造函数是 explicit 的而编译失败
// foo(42); // 错误:无法从 'int' 转换为 'MyClass'
// 你必须显式地创建一个 MyClass 对象
foo(MyClass(42)); // 正确
return 0;
}
这样就可以开始介绍了。
i,构造函数(constructor)
| default (1) | explicit vector (const allocator_type& alloc = allocator_type()); 默认构造,创建一个没有数据的vector。 vector v; |
|---|---|
| fill (2) | explicit vector (size_type n);
vector (size_type n, const value_type& val,
const allocator_type& alloc = allocator_type()); 创建一个有n个元素的vector,每个元素初始化为提供的val的值。(如果没有提供val,则默认初始化为0) vector v(10); cout |

![[C++ STL] vector 详解](https://img-blog.csdnimg.cn/direct/e967033e7dcf44299cb41be4761d7c6b.png)