动态数组vector
是标准模版库(STL, Stardard Template Library)中的模版,它有着节省空间和使用方便的优势,我们用一个形象的例子来说明:
开学了,有40个学生来报名,想要存储每个同学的姓名,可以使用静态数组存储
开学了,未知有多少个同学,要存储每个同学的姓名,可以使用动态数组存储
所在头文件:#include <vector>
想要定义一个vector
容器,有四种方式,也叫做构造(Construction):
vector<Typ> T
:定义一个Typ
类型的动态数组T
vector<Typ> T(n)
:定义一个Typ
类型的动态数组T
,并初始为n
项vector<Typ> T(n, x)
:定义一个Typ
类型的动态数组T
,并初始化为n
项,每一项赋值为x
vector<Typ> T2(T1)
:定义一个Typ
类型的动态数组T2
,并复制T1
到T2
另外在vector
容器中还可以释放所占的空间,也叫做析构(Deconstruction):
vector<Typ>().swap(T)
:释放一个Typ
类型的动态数组T
所占的空间T.swap(vector<Typ>())
:一样的,释放空间
vector
容器中还有很多函数,最常用的有这些:
T.push_back(n)
:在动态数组T
的末尾插入元素n
T.pop_back()
:删除T
的最后一个元素T.size()
:返回数组T
的长度(返回类型size_t
)T.capacity()
:返回数组T
的容量,也就是一共存储了多少个数据,删除的也算(也返回size_t
类型)T.clear()
:清空数组T
的所有元素T.empty()
:判断T
数组是否为空,是返回true
,不是返回false
T.begin()
:返回T
的第一项的地址T.end()
:返回T
的地址结束符的地址(也就是最后一项的下一项的NULL
)T.rbegin()
:返回T
的最后一项的地址T.rend()
:返回T
的第一项的地址T.begin()+n
:返回T
的第n
项的地址T.insert(p, x)
:在地址为p
的元素前插入元素x
T.erase(p)
:删除地址为p
的元素T.at(n)
或者T[n]
:返回T
的第n
项(注意下标)
动态数组的迭代器类型:vector<Typ>::iterator
,也可以简写为自动类型auto
(Dev-C++使用者点击我)
vector
容器有这些遍历方法:
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> T;
for(int i=0; i<n; i++) {
int m;
cin >> m;
T.push_back(m);
}
for(int i=0; i<T.size(); i++) { //使用遍历变量遍历
cout << T[i] << " ";
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> T;
for(int i=0; i<n; i++) {
int m;
cin >> m;
T.push_back(m);
}
for(vector<int>::iterator it=T.begin(); it!=T.end(); it++) { //迭代器遍历
cout << *it << " ";
} // vector<int>::iterator 可以简写为 auto
return 0;
}
这是一道直接涉及到动态数组的题目
题目描述
给定一个N个数的数组,M次操作,每次操作为下列操作之一。求最后的数组。
操作1:在第X个数之后插入一个数Y。
操作2:删除第X个数。
输入描述
第一行两个整数N,M(N,M≤1000),N表示数组中一开始有N个数,M表示M次操作。
第二行N个整数,表示原来的数组。
接下来M行,每行第一个数OPT,表示操作类型。
对于操作1,接下来两个数X,Y,表示在第X个数之后插入一个数Y,保证0≤X≤当前数的个数,若X=0,表示在数组开头插入。
对于操作2,接下来一个数X,表示要删除第X个数,保证1≤X≤当前数的个数
输出描述
输出若干个数,表示最后的数组。
样例输入
5 3
1 2 3 4 5
1 1 6
2 1
2 2
样例输出
6 3 4 5
题解
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m;
vector<int> v;
cin >> n >> m;
for(int i=0; i<n; i++) { //输入
int t;
cin >> t;
v.push_back(t);
}
for(int i=0; i<m; i++) {
int opt;
cin >> opt;
if(opt==1) { //操作一:插入元素
int x, y;
cin >> x >> y;
v.insert(v.begin()+x, y);
}
if(opt==2) { //操作二:删除元素
int x;
cin >> x;
v.erase(v.begin()+x-1);
}
}
for(int i=0; i<v.size(); i++) {
cout << v[i] << ' ';
}
return 0;
}
预览:
- 十九:指针与迭代器
- 二十:位运算与进制
- 二十一:联合体(union)
- 二十二:类(class)
- 二十三:高精度运算
- 二十四:算法进阶
- 二十五:递归
- 二十六:
vector
容器 - 二十七:递推
- 二十八:
set
容器 - 二十九:
map
容器 - 三十:栈(
stack
) - 三十一:队列(
queue
) - 三十二:电脑基础知识
- 三十三:链表
- 三十四:树
- 三十五:图
…