2023年3月1日更新
南京大学计算机科学与技术系 2022年秋 高级程序设计课程期末考试中,最后一题是手写模板类vector 。
STL 标准模板库(Standard Template Library,STL) 是写cpp时很容易遇到的一个库,非常的好用。
标准模板库(Standard Template Library,STL)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。虽说它主要出现到C++中,但在被引入C++之前该技术就已经存在了很长时间。STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。
—-baidu
借此高级程序设计上机的好机会,在此复习一下我STL中最喜欢的vector,这是我唯一自己半实现过的库,斗胆称一声略微了解。
c++有了vector,就像南大有了麦当当,以色列有了耶路撒冷!你可以忘记动静态数组忘记越界访问忘记烫烫烫的往事。与其他的容器比较,vector是和数组最相似的:里面什么都能放,无论结构体还是vector套vector;顺序存储,支持下标访问;迭代器与其他的不同可以每次加n。如果课程没有特殊要求,又不想使用数据库来管理文件,vector一定是我们的首选。
那么就来看一看吧
1. 构造vector
1 | vector<int> v0; |
容量
Capacity
- size() – Returns the number of elements in the vector.
- max_size() – Returns the maximum number of elements that the vector can hold.
- capacity() – Returns the size of the storage space currently allocated to the vector expressed as number of elements.
- resize(n) – Resizes the container so that it contains ‘n’ elements.
- empty() – Returns whether the container is empty.
- shrink_to_fit() – Reduces the capacity of the container to fit its size and destroys all elements beyond the capacity.
- reserve() – Requests that the vector capacity be at least enough to contain n elements.
访问
数组访问
1 | for (i=0;i<v.size();i++) |
迭代器访问
1 | vector<int>::iterator it; |
增删
push_back pop_back
主要是在尾部插入元素:push_back(elem)和尾部弹出元素:pop_back()
1 | pop_back()//无输入无返回值 |
这两个都很友好,但是…
clear()
清除容器中所有数据
erase
删除指定元素:erase()看着很强大的一个函数,其实会导致下标的变化,于是遍历变得困难,
erase函数可以用于删除vector容器中的一个或者一段元素,
在删除一个元素的时候,其参数为指向相应元素的迭代器,
而在删除一段元素的时候,参数为指向一段元素的开头的迭代器以及指向结尾元素的下一个元素的迭代器;
在进行单个元素删除后,传入的迭代器指向不变,仍然指向被删除元素的位置,而被删除元素之后的所有元素都向前移动一位,也就是该迭代器实际上是指向了原来被删除元素的下一个元素。
删除一段元素后,传入的迭代器指向也是不变的,仍然指向原来传进去时候的位置,修改的是删除段后面的元素的位置。