C++ 标准模板库(STL)中的 vector
是一个动态数组,可以在运行时动态增加或减少大小。它提供了一组功能丰富的方法来管理元素集合,是 C++ 中最常用的容器之一。
特点:
-
动态大小:
vector
可以动态地增长或缩小,使得它适用于需要动态大小的情况。 -
连续存储:
vector
中的元素在内存中是连续存储的,这意味着可以通过指针进行高效的元素访问。 -
随机访问:可以通过索引在常量时间内访问
vector
中的任何元素。 -
自动管理内存:
vector
在需要时自动管理存储空间的分配和释放,减轻了程序员的负担。
- vector的定义
vector<typename> name;
相当于定义了一个一维数组name[SIZE],只不过其长度可以根据需要进行变化,比较节省空间,通俗来讲,vector就是“变长数组”。
类似于一维数组,typename可以是任何基本类型,也可以是STL容器。
vector<int> name;
vector<double> name;
vector<char> name;
vector<Node> name; //Node为结构体类型
vector<vector<int> > name;
- vector容器内元素的访问
vector可以通过下标和迭代器来访问。
(1)通过下标访问
这里,可以把vector看成普通数组,访问方式和普通数组一样(如vi[0]、vi[1])。
(2)通过迭代器访问
迭代器可以理解为一种类似于指针的东西,定义为
vector<typename>::iterator it;
通过下面的例子来演示通过迭代器访问数组元素:
#include <iostream>
#include <vector>
using namespace std;
vector<int> vi;
int main()
{
for(int i=0;i<5;i++){
vi.push_back(i+1);
}
vector<int>::iterator it=vi.begin(); //迭代器指向vi的首地址
for(int i=0;i<5;i++){
cout<<*(it+i)<<" "; //输出vi[i]
}
return 0;
}
输出结果:
1 2 3 4 5
- vector常用函数
(1)push_back()
push_back(x)功能为在vector后面添加一个元素x,时间复杂度为O(1)。
#include <iostream>
#include <vector>
using namespace std;
vector<int> vi;
int main()
{
for(int i=0;i<5;i++){
vi.push_back(i); //将i的值依次插入到vi的尾部
}
for(int i=0;i<vi.size();i++){
cout<<vi[i]<<" ";
}
return 0;
}
输出结果:
0 1 2 3 4
(2)pop_back()
pop_back()用来删除vector的尾元素,时间复杂度为O(1)。
#include <iostream>
#include <vector>
using namespace std;
vector<int> vi;
int main()
{
for(int i=0;i<5;i++){
vi.push_back(i); //将i的值依次插入到vi的尾部
}
vi.pop_back(); //删除尾元素
for(int i=0;i<vi.size();i++){
cout<<vi[i]<<" ";
}
return 0;
}
输出结果:
0 1 2 3
(3)size()
size()用来获得vector中元素的个数,时间复杂度为O(1)。
#include <iostream>
#include <vector>
using namespace std;
vector<int> vi;
int main()
{
for(int i=0;i<5;i++){
vi.push_back(i); //将i的值依次插入到vi的尾部
}
cout<<vi.size();
return 0;
}
输出结果:
5
(4)clear()
clear()用来清空vector中的所有元素,时间复杂度为O(n)。
#include <iostream>
#include <vector>
using namespace std;
vector<int> vi;
int main()
{
for(int i=0;i<5;i++){
vi.push_back(i); //将i的值依次插入到vi的尾部
}
vi.clear(); //清空所有元素
cout<<vi.size();
return 0;
}
输出结果:
0
(5)insert()
insert(it, x)用来向vector的任意迭代器it处插入一个元素x,时间复杂度为O(n)。
#include <iostream>
#include <vector>
using namespace std;
vector<int> vi;
int main()
{
for(int i=0;i<5;i++){
vi.push_back(i); //将i的值依次插入到vi的尾部
}
vi.insert(vi.begin()+2,10); //将10插入到vi[2]的位置
for(int i=0;i<vi.size();i++){
cout<<vi[i]<<" ";
}
return 0;
}
输出结果:
0 1 10 2 3 4
(6)erase()
erase()既可以删除单个元素,还可以删除一个区间的所有元素。时间复杂度为O(n)。
删除单个元素
#include <iostream>
#include <vector>
using namespace std;
vector<int> vi;
int main()
{
for(int i=0;i<5;i++){
vi.push_back(i); //将i的值依次插入到vi的尾部
}
vi.erase(vi.begin()+2); //删除vi[3]
for(int i=0;i<vi.size();i++){
cout<<vi[i]<<" ";
}
return 0;
}
输出结果:
0 1 3 4
删除一个区间内的所有元素
#include <iostream>
#include <vector>
using namespace std;
vector<int> vi;
int main()
{
for(int i=0;i<5;i++){
vi.push_back(i); //将i的值依次插入到vi的尾部
}
vi.erase(vi.begin()+2,vi.begin()+4); //删除vi[2]、vi[3]
for(int i=0;i<vi.size();i++){
cout<<vi[i]<<" ";
}
return 0;
}
输出结果:
0 1 4