vector
介绍
vector(向量)是一种序列容器,表示为可以改变大小的数组。vector中的元素使用连续的存储位置,这意味着也可以使用指向其元素的常规指针+偏移量来访问任意元素,且与数组一样高效。但与数组不同的是,vector的大小可以动态变化,容器会自动处理他们的存储空间。在其内部,vector使用动态分配的数组来存储他们的元素。当插入新元素需要增大容量时,存储空间需要重新分配,这意味着需要分配一个新数组并将所有元素移动到其中。就处理时间而言,这是一个相对昂贵的任务,因此vector不会在每次想容器中添加元素时都重新分配。相反,vector容器可以分配一些额外的存储空间,以适应可能的增长,因此容器的实际容量肯呢个大于包含其元素严格所需的存储空间。因此与数组相比,向量消耗更多的内存,以换取更有效的方式管理存储和动态增长的能力。与其他动态序列容器(deque、列表、前向列表)相比,vector可以非常高效地访问其元素,并且可以相对高效地从其末端添加或删除元素。对于涉及在末尾以外的位置插入或删除元素的操作,他们的性能比其他操作差,并且迭代器引用的一致性不如列表和前向列表。
以上是官方对于vector的介绍,从上面我们能够了解到vector本质上就是一种可动态增长的顺序表,其特性与数据结构中学习的顺序表相差无几,但vector的出现极大地简化了我们使用顺序表的工作量,且vector与其他容器有着较深的联系,因此学好vector有利于我们未来的学习。
vector的使用
对于vector,在学习时我们一定要学会查看文档:vector文档,vector在实际中非常重要,我们要熟悉常见的接口,以应对未来的使用。
(constructor)构造函数
| 函数声明 | 接口说明 |
|---|---|
| vector(); | 无参构造 |
| vector(size_t n, const T& val = T()); | 构造并初始化n个val |
| vector(const vector& x); | 拷贝构造 |
| vector(inputiterator first, inputiterator last); | 使用迭代器进行区间初始化构造 |
代码演示:
//构造5个int的空间
vector<int> v1(5);
//构造10个int空间,并初始化为1
vector<int> v2(10, 1);
//去掉v2的第一个和最后一个空间,使用剩余空间构造并用相同数值初始化
vector<int> v3(++v2.begin(), --v2.end());
//拷贝构造
vector<int> v4 = v3;
iterator迭代器的使用
| 函数名称 | 接口说明 |
|---|---|
| begin+end | 获取第一个数据位置的iterator/const_iterator,获取最后一个数据的下一个位置的iterator/const_iterator. |
| rbegin+rend | 获取最后一个数据位置的reverse_iterator,获取第一个数据前一个位置的reverse_iterator |

代码演示:
vector<int> v(10, 1);
// []下标形式
for (size_t i = 0; i < v.size(); i++)
{
cout << v[i] << " ";
}
cout << endl;
//迭代器
vector<int>::iterator it = v.begin();
while (it != v.end())
{
cout << *it << " ";
it++;
}
cout << endl;
//反向迭代器
vector<int>::reverse_iterator rit = v.rbegin();
while(rit != v.rend())
{
cout << *rit << " ";
rit++;
}
cout << endl;
//范围for
for (auto& e : v)
{
cout << e << " ";
}
cout << endl;
空间管理函数
| 函数名称 | 接口说明 |
|---|---|
| size | 获取数据个数 |
| capacity | 获取容量大小 |
| empty | 判断是否为空 |
| resize | 改变vector的_size |
| reserve | 改变vector的capacity |
注意:
- capacity函数在vs和g++下的扩容机制略有不同,vs下capacity是按1.5倍增长的,g++下是按2倍增长的。在面试中经常会考察这个问题,不要固化地认为vector的扩容都是2倍,具体增长多少是根据具体的需求来定义的。vs是PJ版本STL,g++是SGI版本STL。
- reserve函数只负责开空间,如果明确知道需要开多少空间,reserve就可以一次性开好,缓解了多次扩容的代价。
- resize在开空间的同时还会进行初始化,影响_size。
扩容机制测试代码:
// 测试vector的默认扩容机制
void TestVectorExpand()
{
size_t sz;
vector<int> v;
sz = v.capacity();
cout << "making v grow:\n";
for (int i = 0; i < 100; ++i)
{

最低0.47元/天 解锁文章
2823

被折叠的 条评论
为什么被折叠?



