深入探索 C++ STL 中的 Vector 容器

深入探索 C++ STL 中的 Vector 容器

在 C++ 标准模板库(STL)中,vector 是一种非常常用且功能强大的容器。它类似于动态数组,提供了灵活的内存管理和丰富的操作接口。本文将通过一系列示例代码,深入探讨 vector 容器的构造、赋值、插入删除、容量管理以及数据存取等常用功能。

1. Vector 的构造方式

vector 提供了多种构造方式,以满足不同的初始化需求。以下是一些常见的构造方式:

默认构造

cpp复制

vector<int> s1;

默认构造的 vector 是空的,没有任何元素。

范围构造

cpp复制

vector<int> s2(++s1.begin(), s1.end());

通过指定一个范围(如迭代器区间),可以将该范围内的元素拷贝到新 vector 中。注意,beginend 满足左闭右开原则。

填充构造

cpp复制

vector<int> s3(6, 10);

通过指定元素数量和初始值,可以快速初始化一个 vector,其中包含 6 个值为 10 的元素。

拷贝构造

cpp复制

vector<int> s4(s3);

通过拷贝构造,可以创建一个与原 vector 完全相同的副本。

2. Vector 的赋值操作

vector 的赋值操作也非常灵活,支持多种方式:

等号赋值

cpp复制

vector<int> s2;
s2 = s1;

通过等号赋值,可以将一个 vector 的内容拷贝到另一个 vector 中。

assign 方法

cpp复制

vector<int> s3;
s3.assign(6, 6); // 初始化 6 个值为 6 的元素

assign 方法可以用于重新分配 vector 的内容,支持多种参数形式,如指定元素数量和值、指定范围等。

区间赋值

cpp复制

vector<int> s4;
s4.assign(s3.begin(), (--s3.end()));

通过指定范围,可以将指定区间内的元素拷贝到 vector 中。

3. Vector 的插入与删除操作

vector 提供了丰富的插入和删除操作,支持在任意位置进行操作:

插入操作

  • 在尾部插入元素:

cpp复制

s1.push_back(9);
  • 在头部插入元素:

cpp复制

s1.insert(s1.begin(), 9);
  • 在尾部插入多个元素:

cpp复制

s1.insert(s1.end(), 3, 8);

删除操作

  • 删除尾部元素:

cpp复制

s1.pop_back();
  • 删除头部元素:

cpp复制

s1.erase(s1.begin());
  • 删除指定区间内的元素:

cpp复制

s1.erase(s1.begin(), (--s1.end()));
  • 清空所有元素:

cpp复制

s1.clear();

4. Vector 的容量与大小管理

vector 的容量和大小是两个重要的概念:

  • size():返回 vector 中当前存储的元素个数。

  • capacity():返回 vector 当前分配的内存容量(以元素个数为单位)。

vector 的元素数量超过当前容量时,会自动扩容。扩容会导致内存重新分配和数据拷贝,可能会影响性能。为了避免频繁扩容,可以提前预留空间:

预留空间

cpp复制

s.reserve(1000);

通过 reserve 方法,可以提前分配足够的内存空间,减少后续扩容的次数。

5. Vector 的数据存取

vector 提供了多种数据存取方式:

  • at():通过索引访问元素,支持边界检查,如果索引超出范围会抛出异常。

  • []:通过索引访问元素,不支持边界检查,性能更高。

  • front():访问第一个元素。

  • back():访问最后一个元素。

6. Vector 的容器互换

vector 支持容器互换操作,可以快速交换两个 vector 的内容:

cpp复制

s1.swap(s2);

此外,还可以通过创建匿名对象来收缩内存:

cpp复制

vector<int>(s1).swap(s1);

通过这种方式,可以将 vector 的容量收缩到当前大小,同时保留数据。

7. 性能优化:预留空间的重要性

在实际应用中,vector 的性能优化非常重要。通过预留空间,可以显著减少内存分配的次数,从而提高程序的运行效率。以下是一个对比示例:

未预留空间

cpp复制

vector<int> s;
for (int i = 0; i < 1000; i++)
{
    s.push_back(1);
}

在未预留空间的情况下,vector 会多次进行内存分配和数据拷贝。

预留空间

cpp复制

vector<int> s;
s.reserve(1000);
for (int i = 0; i < 1000; i++)
{
    s.push_back(1);
}

通过预留空间,可以将内存分配次数减少到一次,从而提高性能。

总结

vector 是 C++ STL 中一个非常强大且灵活的容器,提供了丰富的构造、赋值、插入删除、容量管理和数据存取功能。通过合理使用这些功能,可以高效地管理动态数据集合。同时,通过预留空间等优化手段,可以显著提升程序的运行效率。希望本文的介绍能够帮助你更好地理解和使用 vector 容器。

如果你对 vector 有更多问题,或者对其他 STL 容器感兴趣,欢迎留言交流!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值