c++ vector的用法

ops/2024/11/14 19:43:28/

std::vector 是 C++ 标准库中一个非常常用的动态数组容器。它可以存储任意数量的元素,并且提供了灵活的大小调整和对元素的快速访问。以下是 std::vector 的基本用法说明,包括常见操作和示例代码。

1. 头文件

在使用 std::vector 之前,需要包含相应的头文件:

#include <vector>

2. 定义和初始化

可以使用以下方式定义和初始化 std::vector

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

3. 常用操作

a. 添加元素

可以使用 push_back 方法在向量末尾添加元素:

vec.push_back(1);
vec.push_back(2);

如果想在特定位置插入元素,可以使用 insert 方法:

vec.insert(vec.begin() + 1, 3); // 在索引 1 处插入 3
b. 访问元素

可以使用下标操作或 at 方法访问元素:

int first = vec[0]; // 使用下标操作
int second = vec.at(1); // 使用 at 方法

注意:at 方法会进行边界检查,若索引越界会抛出异常。

c. 删除元素

可以使用 pop_back 方法删除最后一个元素,使用 erase 方法删除特定位置的元素:

vec.pop_back(); // 删除最后一个元素
vec.erase(vec.begin() + 1); // 删除索引 1 处的元素
d. 遍历元素

可以使用范围 for 循环或迭代器遍历 std::vector

for (const auto& elem : vec) {std::cout << elem << " ";
}for (auto it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << " ";
}
e. 获取大小和容量

可以使用 size 方法获取当前元素个数,使用 capacity 方法获取当前容量:

std::cout << "Size: " << vec.size() << std::endl;
std::cout << "Capacity: " << vec.capacity() << std::endl;
f. 清空和缩小容量

可以使用 clear 方法清空向量,使用 shrink_to_fit 方法缩小容量以适应当前大小:

vec.clear(); // 清空向量
vec.shrink_to_fit(); // 收缩容量

4. 示例代码

以下是一个完整的示例代码,演示了 std::vector 的基本用法:

#include <iostream>
#include <vector>int main() {// 创建一个整数向量并初始化std::vector<int> vec = {1, 2, 3, 4, 5};// 添加元素vec.push_back(6);vec.push_back(7);// 在索引 2 处插入元素vec.insert(vec.begin() + 2, 99);// 遍历向量std::cout << "Vector elements: ";for (const auto& elem : vec) {std::cout << elem << " ";}std::cout << std::endl;// 访问元素std::cout << "First element: " << vec.at(0) << std::endl;// 删除元素vec.pop_back(); // 删除最后一个元素vec.erase(vec.begin() + 1); // 删除索引 1 的元素// 输出大小和容量std::cout << "Size after modifications: " << vec.size() << std::endl;std::cout << "Capacity after modifications: " << vec.capacity() << std::endl;// 清空向量vec.clear();std::cout << "Size after clearing: " << vec.size() << std::endl;return 0;
}

5. 注意事项

  • 动态大小std::vector 是动态数组,能够自动调整大小,但每次扩展时可能会导致重新分配内存。如果频繁地在末尾添加元素,可能会导致性能下降,特别是在大容量的情况下。可以使用 reserve() 方法预先分配足够的空间以提高性能。

    std::vector<int> vec;
    vec.reserve(100); // 预先分配空间以容纳100个元素
    

  • 指针和迭代器:在对 std::vector 进行添加或删除操作后,所有指向其元素的指针和迭代器可能会失效。因此,在进行这些操作后,应谨慎使用指针和迭代器。

  • 内存管理std::vector 自动管理内存,但是在使用 std::vector 存储指针时,用户需要手动管理指针所指向的对象的生命周期,以避免内存泄漏。

6. 性能特点

  • 随机访问:由于 std::vector 内部是连续的内存块,访问元素的时间复杂度为 O(1),这使得它在随机访问时非常高效。

  • 插入和删除:在末尾插入和删除元素的时间复杂度平均为 O(1),但在中间插入或删除元素的时间复杂度为 O(n),因为需要移动元素。

  • 内存分配:当 std::vector 超过当前容量时,会自动分配更大的内存并将现有元素复制到新内存中,这个过程是 O(n) 的,所以在可能大量插入元素的情况下,使用 reserve() 提前分配内存会更高效。


http://www.ppmy.cn/ops/105017.html

相关文章

云计算day37

使⽤docker部署project-exam-system 1. 背景&#xff0c;在⼀台主机之内&#xff0c;实现容器的编排&#xff0c;发布考试系统 2. 环境准备 1. docker 1. vim /etc/docker/daemon.json 2. docker-compos 3. 普通的部署 1. 镜像 1. 前端&#xff1a;nginx latest服务 1…

机械学习—零基础学习日志(概率论总笔记2)

正态分布 高斯分布也叫做正态分布。假定事件A经过n次试验后发生了k次&#xff0c;把k的概率分布图画一下&#xff0c;就得到了一个中间鼓起&#xff0c;像倒扣的钟一样的对称图形。 18世纪&#xff0c;数学家棣莫弗和拉普拉斯把这种中间大&#xff0c;两头小的分布称为正态分布…

数据分析及应用:如何分析基于绝对中位差的异常值检测问题?

目录 0 场景描述 1 数据准备 2 问题分析 abs(rn - (cnt+1)/2) < 1 3 小结 0 场景描述 数据集中可能存在异常的值。值存在异常有多种原因: (1)可能是数据收集方式有问题,比如记录值的仪表存在误差;(2)可能是数据输入错误导致的;(3)还可能是因为数据生成时环境…

​数字IC设计基本概念之多时钟设计​

当设计中使用了多个时钟时&#xff0c;这些时钟域之间的关系可能是synchronous、asynchronous或者exclusive的。如下所示&#xff1a; Synchronous&#xff1a; Asynchronous&#xff1a; Exclusive&#xff1a; 需要人为地指定设计中时钟之间的关系&#xff0c;EDA工具才能正…

国产游戏崛起:以《黑神话:悟空》为镜的未来展望

国产游戏崛起&#xff1a;以《黑神话&#xff1a;悟空》为镜&#xff0c;挑战、机遇与IT技术的未来展望 在这个数字化时代&#xff0c;国产游戏行业如同破晓的曙光&#xff0c;照亮了全球游戏市场的天际。其中&#xff0c;《黑神话&#xff1a;悟空》以其惊艳的画面、深邃的文…

【问题分析】关于SF侧Launcher层级的分析【Android15】

一般来说&#xff0c;SF侧的Layer层级和WMS侧WindowContainer侧的层级是一一对应的&#xff0c;但是对Launcher来说&#xff0c;则略有不同&#xff0c;这点之前我在打印SF信息的时候&#xff0c;也有注意过&#xff0c;但是没有去仔细思考过为什么会这样&#xff0c;直到这次分…

规控面试复盘

目录 前言 一、京东方 1、CPP和C的区别是什么? 2、讲一下的ROS的话题通信 二、Momenta(泊车部门实习面试) 1、MPC的预测时间步是多少? 2、MPC的代价函数考虑的是什么? 三、九识 1、智能指针有哪些优缺点? 优点: 缺点: 2、Protobuf的数据传输效率为什么更高…

ContentProvider 数据供给方

作用 ContentProvider使用数据库模型的基本表格来提供需要共享的数据 表格每一行表示一条记录&#xff08;都包含"_ID"字段&#xff09;&#xff0c;每一列表示该类型的数据 URI 作用 资源的唯一标识符——提供数据位置 组成 scheme: 一般 "content:/"…