C++ 入门14:STL 容器之向量(vector)

往期回顾:

C++ 入门11:虚函数和多态-CSDN博客

C++ 入门12:模板(Template)-CSDN博客

C++ 入门13:异常处理-CSDN博客


C++ 入门14:STL 容器之向量(vector) 

一、前言

在前面文章的学习中,我们学习了类和对象的基础知识、构造函数、拷贝构造函数、静态成员、常量成员、运算符重载、友元函数、友元类、继承和派生类、虚函数和多态、模板以及异常处理。今天,我们将学习 C++ 标准模板库(STL)中的一种重要容器——向量(vector)。向量是一种动态数组,可以方便地进行元素的添加和删除操作。这是STL里非常常用的一种,需要好好掌握。

二、STL 容器之向量(vector)

2.1、 什么是向量?

向量(Vector)是C++标准模板库(Standard Template Library, STL)中一个非常核心且广泛使用的容器类。它提供了一种能够存储同一类型元素的动态数组的实现。

向量在底层通常是通过一个连续的内存块来存储元素,但与传统的静态数组不同,向量的大小(即它能存储的元素数量)是可以动态变化的。这意味着,随着程序运行的需要,向量可以自动地增加其容量以容纳更多的元素,或者减少其占用的内存空间(尽管减少容量通常不会自动发生,除非通过特定的成员函数如shrink_to_fit来请求)。

2.2、向量的主要特点

  1. 动态数组:向量提供了类似数组的顺序访问功能,但允许在运行时动态地改变其大小。这意味着你可以像使用数组一样通过索引来访问向量中的元素,但无需在编译时指定数组的大小。

  2. 自动内存管理:当你向向量中添加元素时,如果当前分配的存储空间不足以容纳新元素,向量会自动重新分配一块更大的内存区域,并将现有元素以及新元素复制到新的内存位置。同样,当元素被移除时,虽然向量的实际大小会减小,但底层内存不会自动减少,除非特别请求。

  3. 提供丰富的成员函数:向量提供了许多成员函数来支持各种操作,如push_back用于在向量末尾添加一个元素,pop_back用于移除向量末尾的元素,size返回当前向量的元素个数,capacity返回当前向量分配的存储空间大小等。

  4. 高效访问:由于向量在内存中连续存储元素,因此通过索引访问向量中的元素是非常高效的,时间复杂度为O(1)。

  5. 模板支持:向量是模板类,因此它可以存储任何类型的元素。你只需在声明向量时指定元素的类型即可。

2.3、向量的使用场景

1、当需要存储一个元素集合,并且这个集合的大小可能会在运行时改变时。

2、当需要频繁访问集合中的元素,且对访问速度有较高要求时(因为向量提供了高效的随机访问)。
3、当想要自动管理内存,避免手动处理动态数组时可能遇到的内存泄漏等问题。

2.4、向量的基本操作

(1)引入头文件

在使用向量之前,需要引入头文件 <vector>

#include <vector>

(2)创建向量

我们可以使用不同的方式来创建向量。

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> vec1; // 创建一个空的向量
    vector<int> vec2(10); // 创建一个包含10个元素的向量,每个元素的值为0
    vector<int> vec3(10, 5); // 创建一个包含10个元素的向量,每个元素的值为5
    vector<int> vec4 = {1, 2, 3, 4, 5}; // 使用列表初始化向量

    return 0;
}

2.5、向量的常用成员函数

(1)添加元素

使用 push_back 函数在向量的末尾添加元素。

vector<int> vec;
vec.push_back(10);
vec.push_back(20);
vec.push_back(30);

(2)访问元素

使用 at 函数或下标运算符 [] 访问向量中的元素。

cout << "Element at index 0: " << vec.at(0) << endl;
cout << "Element at index 1: " << vec[1] << endl;

(3)修改元素

直接使用下标运算符 [] 修改向量中的元素。

vec[0] = 100;
cout << "Modified element at index 0: " << vec[0] << endl;

(4)删除元素

使用 pop_back 函数删除向量末尾的元素。

vec.pop_back();
cout << "After pop_back, size of vec: " << vec.size() << endl;

(5)获取向量的大小

使用 size 函数获取向量中的元素个数。        

cout << "Size of vec: " << vec.size() << endl;

(6)检查向量是否为空

使用 empty 函数检查向量是否为空。

if (vec.empty()) {
    cout << "vec is empty" << endl;
} else {
    cout << "vec is not empty" << endl;
}

2.6、 向量的迭代器

向量提供了一种灵活的方式来访问其元素——迭代器。迭代器是一种对象,它可以用来遍历容器中的元素。

(1)获取迭代器

使用 begin 函数获取指向向量第一个元素的迭代器,使用 end 函数获取指向向量最后一个元素的下一个位置的迭代器。

vector<int> vec = {10, 20, 30, 40, 50};

// 使用迭代器遍历向量
for (vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {
    cout << "Element: " << *it << endl;
}

(2)使用范围循环

C++11 引入了范围循环,可以更简洁地遍历向量。

for (int val : vec) {
    cout << "Element: " << val << endl;
}

2.7、 向量的高级操作

(1)插入元素

使用 insert 函数在向量的指定位置插入元素。

vector<int> vec = {10, 20, 30};
vec.insert(vec.begin() + 1, 15); // 在第二个位置插入15
for (int val : vec) {
    cout << "Element: " << val << endl;
}

(2)清空向量

使用 clear 函数清空向量中的所有元素。

vector<int> vec = {10, 20, 30, 40, 50};
vec.clear(); // 清空向量
cout << "After clear, size of vec: " << vec.size() << endl;

2.8、向量与动态数组的区别

向量和动态数组(如 new[] 分配的数组)有一些相似之处,但也有重要的区别:

自动管理内存

向量会自动管理内存,当向量大小增加时,会自动分配更多的内存。而动态数组需要手动管理内存。
方便的操作向量提供了丰富的成员函数,如 push_backinserterase 等,而动态数组需要手动实现这些操作。
安全性向量提供边界检查,如 at 函数可以抛出异常,而动态数组没有边界检查,可能导致未定义行为。

以上就是 C++ 标准模板库中的向量(vector)的基础知识点了。包括向量的基本操作、迭代器的使用以及一些高级操作。向量是 C++ 中非常常用的一种容器,它提供了动态调整大小的功能,非常适合需要频繁修改大小的场景。基本上在开发中都会用到的,大家多看看,一定要掌握。

都看到这里了,点个赞再走呗朋友~

加油吧,预祝大家变得更强!

  • 22
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值