【C++】vector(1)
😈个人主页: 起名字真南
😈个人专栏:【数据结构初阶】 【C语言】 【C++】
目录
- 引言
- 1 vector 的基本知识
- 1.1 vector 的特点
- 2 vector 的主要功能和操作
- 2.1 vector 的构造
- 2.2 vector 的增删改查
- 2.3 vector 的容量
引言
在C++的标准模板库(STL)中,
vector
是最常用的容器之一。它提供了一个动态数组,允许我们高效地存储和管理大量的数据。相比于传统的 C 风格数组,vector
不仅支持动态扩展,还具备了丰富的成员函数用于操作数据,使得程序更加简洁和高效。在本篇文章中,我们将深入探讨 C++vector
的实现原理、常见的用法,并通过具体的代码示例展示其在实际应用中的作用。
1 vector 的基本知识
std::vector 是一个动态数组容器,与 C 语言的数组不同,vector 的大小可以动态扩展或缩减。它可以方便地插入、删除、访问和管理元素,并且具备强大的内存管理功能。
vector 基础知识以及相关资料
1.1 vector 的特点
- 动态扩展:在需要时vector可以动态开辟自己的内存,这点区别于静态数组
- 连续内存:vector 是STL中的数组容器,其在内存中的存储都是连续的所以可以通过下标访问
- 迭代器支持:vector 支持通过迭代器进行遍历循环整个容器
- 自动内存管理 :vector 会自动管理自己的内存,如果空间不够则会自己开辟空间,当元素被删除时vector也会释放不在使用的内存
2 vector 的主要功能和操作
2.1 vector 的构造
构造函数声明 | 接口说明 |
---|---|
vector() | 无参构造 |
vector(size_type n, const value_type& val = value_type()) | 构造并初始化 n 个 val |
vector(const vector& x) | 拷贝构造 |
vector(InputIterator first, InputIterator last) | 使用迭代器进行初始化构造 |
代码演示:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
//创建一个空的vector v1
vector<int> v1;
//创建一个有十个数据并且初始化都为9的vector v2
vector<int> v2(10, 9);
//拷贝构造
vector<int> v3(v2);
//使用迭代器进行构造
vector<int> v4(v2.begin(), v2.end());
return 0;
}
调试结果:
如果我们想通过控制台来直观的看到每个vector的存储情况应该怎么做呢?
cout << "v1 :";
for (auto it : v1)
{
cout << it << " ";
}
cout << endl;
cout << "v2 :";
for (auto it : v2)
{
cout << it << " ";
}
cout << endl;
cout << "v3 :";
for (auto it : v3)
{
cout << it << " ";
}
cout << endl;
cout << "v4 :";
for (auto it : v4)
{
cout << it << " ";
}
cout << endl;
return 0;
因为vector支持迭代器遍历循环数组所以我们可以通过迭代器大打印出数组中的所有元素
输出结果:
2.2 vector 的增删改查
vector增删查改 | 接口说明 |
---|---|
push_back(const value_type& val) | 尾插 |
pop_back(const value_type& val) | 尾删 |
find(InputIterator first, InputIterator last, const T& val) | 查找。(注意这个是算法模块实现,不是vector的成员接口) |
insert(iterator position, const value_type& val) | 在position之前插入val |
erase(const_iterator position) | 删除position位置的数据 |
swap(vector& x) | 交换两个vector的数据空间 |
operator[] | 像数组一样访问 |
代码演示:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(4);
v1.push_back(5);
for (auto it : v1)
{
cout << it << " ";
}
cout << endl;
v1.pop_back();
v1.pop_back();
v1.pop_back();
for (auto it : v1)
{
cout << it << " ";
}
cout << endl;
//auto it = find(v1.begin(), v1.end(), 2);
//cout << "insert:";
//cout << *it << endl;
//v1.insert(it, 6);
//for (auto it : v1)
//{
// cout << it << " ";
//}
//cout << endl;
//cout << "find:";
//auto i = find(v1.begin(), v1.end(), 2);
//v1.erase(i);
//for (auto i : v1)
//{
// cout << i << " ";
//}
//cout << endl;
vector<int> v2(5, 5);
vector<int> v3(6, 6);
cout << "v2 :";
for (int i = 0; i < 5; i++)
{
cout << v2[i];
}
cout << endl;
cout << "v3 :";
for (int i = 0; i < 6; i++)
{
cout << v3[i];
}
cout << endl;
v2.swap(v3);
cout << "swap" << endl;
cout << "v2 :" ;
for (int i = 0; i < 6; i++)
{
cout << v2[i];
}
cout << endl;
cout << "v3 :";
for (int i = 0; i < 5; i++)
{
cout << v3[i];
}
return 0;
}
我们在使用find函数的时候使用的不是vector的成员函数,而是算法库**(algorithm)**实现的返回的是目标元素的迭代器,我们在使用迭代器进行操作的时候会涉及到迭代器失效的问题这个我们后续会讲,目前只是演示成员函数的使用方法以及使用后在控制台的输出。
输出结果:
2.3 vector 的容量
容量空间 | 接口说明 |
---|---|
size() | 返回当前存储的数据个数,即 vector 中实际使用的元素个数 |
capacity() | 获取当前分配的内存容量,表示 vector 在不需要重新分配内存的情况下可以存储的最大元素数量 |
empty() | 判断容器是否为空,如果 size() 为 0,则返回 true |
resize() | 改变 vector 的大小。如果新大小比当前大,则添加新元素;如果小,则删除多余元素。注意,resize() 也可能触发内存重新分配 |
reserve() | 预留指定的容量,不改变 size() ,但可能会增加 capacity() ,从而减少未来的内存分配次数,提高性能 |
代码演示:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
vector<int> v1(10, 0);
vector<int> v2(1);
cout << "v1.size() :" << v1.size() << endl;
cout << "v2.size() :" << v2.size() << endl;
cout << "v1.capacity() :" << v1.capacity() << endl;
cout << "v2.capacity() :" << v2.capacity() << endl;
vector<int> v3();
if (v1.empty())
{
cout << "false" << endl;
}
else
{
cout << "true" << endl;
}
v1.resize(20);
v2.resize(5);
cout << "v1.resize() :" << v1.size() << endl;
cout << "v2.resize() :" << v2.size() << endl;
v1.reserve(21);
v2.reserve(6);
cout << "v1.reserve() :" << v1.capacity() << endl;
cout << "v2.reserve() :" << v2.capacity() << endl;
return 0;
}
输出结果: