当前位置: 首页 > news >正文

西嘎嘎学习 - C++vector容器 - Day 7

1  vector 是什么

        vector 是一个顺序容器,它内部使用连续的内存空间来存储元素。

        可以像使用数组一样访问 vector 中的元素。

        可以自动扩展大小。

2  vector 的基本用法

(1)引入头文件

#include <vector>

(2)定义 vector

std::vector<int> numbers;    // 定义一个存储 int 类型的 vector

        std::vector 是 vector 的命名空间

        int 是 vector 中存储的数据类型。

        numbers 是 vector 的变量名。

3  常用操作

(1)添加元素

numbers.push_back(10);    // 在 vector 末尾添加一个元素

(2)访问元素

int first = numbers[0];    // 使用下标访问元素(不检查越界)
int second = numbers.at(1);    // 使用 at() 方法访问元素(会检查越界)

(3)获取 vector 的大小

int size = numbers.size();    //获取当前元素个数

(4)判断是否为空

if (numbers.empty())
{std::cout << "Vector 是空的" << std::endl;
}

(5)清空 vector

numbers.clear();    // 清除所有元素

(6)删除最后一个元素

numbers.pop_back();    //删除最后一个元素

4  初始化 vector

(1)默认初始化(空 vector)

std::vector<int> vec1;    // 空 vector

(2)指定大小

std::vector<int> vec2(5);    //创建一个包含 5 个 0 的 vector

(3)指定大小和初始值

std::vector<int> vec3(5,10);    // 创建一个包含 5 个 10 的 vector

(4)用数组初始化

int arr[] = {1,2,3,4,5};
std::vector<int> vec4(arr,arr + 5);    // 用数组初始化 vector

5  遍历 vector

(1)使用下标遍历

for (size_t i = 0; i < vec.size(); ++i)
{std::cout << vec[i] << " ";
}

(2)使用迭代器遍历

for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++i)
{std::cout << *it << " " ;
}

(3)使用范围 for 循环 (C++ 11 及以上)

for (int num : vec)
{std::cout << num << " " ;
}

6  vector 的性能特点

        1.随机访问快:因为 vector 是连续内存,所以随机访问元素非常快。

        2.尾插 / 尾删 快:push_back 和 pop_back 是常数时间操作。

        3.中间插入 / 删除 慢:因为需要移动元素,时间复杂度是 O(n)。

        4.自动扩容:当 vector 容量不足时,会自动分配更大的内存空间,并复制原有元素。

7  完整示例代码

#include <iostream>
#include <vector>  // 引入 vector 头文件int main() {// 1. 定义并初始化一个 vector// 使用初始化列表的方式创建一个包含 5 个整数的 vectorstd::vector<int> numbers = {10, 20, 30, 40, 50};// 2. 输出 vector 的大小和内容std::cout << "初始 vector 的大小是: " << numbers.size() << std::endl;std::cout << "初始 vector 的内容是: ";// 使用范围 for 循环遍历 vectorfor (int num : numbers) {std::cout << num << " ";}std::cout << std::endl;// 3. 在 vector 末尾添加元素// push_back() 会将元素添加到 vector 的末尾numbers.push_back(60);numbers.push_back(70);std::cout << "添加元素后的 vector 内容是: ";for (int num : numbers) {std::cout << num << " ";}std::cout << std::endl;// 4. 修改 vector 中的某个元素// 使用下标访问并修改索引为 2 的元素(从 0 开始)numbers[2] = 99;std::cout << "修改后的 vector 内容是: ";for (int num : numbers) {std::cout << num << " ";}std::cout << std::endl;// 5. 使用 at() 方法访问元素(带越界检查)// at() 会检查索引是否越界,如果越界会抛出异常try {std::cout << "使用 at() 访问第 5 个元素: " << numbers.at(5) << std::endl;} catch (const std::out_of_range& e) {// 捕获越界异常并输出错误信息std::cout << "越界访问错误: " << e.what() << std::endl;}// 6. 删除最后一个元素// pop_back() 会删除 vector 的最后一个元素numbers.pop_back();std::cout << "删除最后一个元素后的 vector 内容是: ";for (int num : numbers) {std::cout << num << " ";}std::cout << std::endl;// 7. 使用迭代器遍历 vector// begin() 返回指向第一个元素的迭代器// end() 返回指向最后一个元素之后的迭代器std::cout << "使用迭代器遍历 vector: ";for (std::vector<int>::iterator it = numbers.begin(); it != numbers.end(); ++it) {// *it 表示解引用迭代器,获取当前元素std::cout << *it << " ";}std::cout << std::endl;// 8. 使用数组初始化 vector// 定义一个数组int arr[] = {100, 200, 300};// 使用数组的起始地址和结束地址初始化 vectorstd::vector<int> vecFromArr(arr, arr + 3);std::cout << "从数组初始化的 vector 内容是: ";for (int num : vecFromArr) {std::cout << num << " ";}std::cout << std::endl;// 9. 二维 vector(vector 的 vector)// 定义一个二维 vector,表示一个 3x3 的矩阵std::vector<std::vector<int>> matrix = {{1, 2, 3},{4, 5, 6},{7, 8, 9}};std::cout << "二维 vector 内容是: " << std::endl;// 外层循环遍历每一行for (const auto& row : matrix) {// 内层循环遍历每一行中的元素for (int val : row) {std::cout << val << " ";}std::cout << std::endl;}// 10. 清空 vector// clear() 会删除 vector 中的所有元素numbers.clear();std::cout << "清空后的 vector 大小是: " << numbers.size() << std::endl;return 0;
}

8  总结

功能说明
push_back()在 vector 末尾添加元素
pop_back()删除 vector 的最后一个元素
size()获取 vector 中元素的个数
at()安全访问元素(带越界检查)
[]快速访问元素(不检查越界)
clear()清空 vector 中的所有元素
empty()判断 vector 是否为空(未在本例中使用)
begin() / end()获取迭代器,用于遍历 vector
数组初始化 vector使用数组指针初始化 vector
二维 vectorvector 的 vector,用于表示矩阵等结构
异常处理捕获越界访问异常
范围 for 循环C++11 引入的简洁遍历方式


文章转载自:

http://WyFUkpzo.wgbmj.cn
http://OUhkOXo4.wgbmj.cn
http://uTFI8L8L.wgbmj.cn
http://RWXxeXf9.wgbmj.cn
http://ZrS8sNJC.wgbmj.cn
http://mEWTlcSX.wgbmj.cn
http://dneJd31E.wgbmj.cn
http://Gkd8zp77.wgbmj.cn
http://NKShQ4gs.wgbmj.cn
http://QjqBYKwx.wgbmj.cn
http://385ZaSIL.wgbmj.cn
http://IGVpoZFC.wgbmj.cn
http://bNXCOWn8.wgbmj.cn
http://jeam2KNd.wgbmj.cn
http://vwFWS4Bv.wgbmj.cn
http://R2KqhWFR.wgbmj.cn
http://e02mJ1qo.wgbmj.cn
http://P2ohOTiY.wgbmj.cn
http://zNomjAAa.wgbmj.cn
http://3rGcDAxK.wgbmj.cn
http://OXprZY1O.wgbmj.cn
http://bafEj7sz.wgbmj.cn
http://man04pfe.wgbmj.cn
http://Sy4DvyOR.wgbmj.cn
http://SaGpCULv.wgbmj.cn
http://atxQu1Jy.wgbmj.cn
http://rXgO6Yj8.wgbmj.cn
http://q4eU82ca.wgbmj.cn
http://kK98X5aB.wgbmj.cn
http://abYeFGFz.wgbmj.cn
http://www.dtcms.com/a/374335.html

相关文章:

  • 第三章:Python基本语法规则详解(二)
  • Next系统总结学习(一)
  • 备考系统分析师-专栏介绍和目录
  • 【rk3229/rk3228a android7.1 LPDDR EMMC EMCP 批量sdk】
  • Kali 自带工具 dirb:Web 路径扫描与 edusrc 挖掘利器
  • 【系统分析师】第2章-基础知识:数学与工程基础(核心总结)
  • 房屋安全鉴定机构评价
  • JAVA:io字符流FileReader和FileWriter基础
  • 从零深入理解嵌入式OTA升级:Bootloader、IAP与升级流程全解析
  • 7.0 热电偶的工作原理
  • GPT(Generative Pre-trained Transformer)模型架构与损失函数介绍
  • 【51单片机】【protues仿真】基于51单片机公交报站系统
  • linux常用命令(2)——系统管理
  • Yarn介绍与HA搭建
  • 记个笔记:Cocos打包安卓使用安卓通信模块
  • 基于Python的云原生TodoList Demo 项目,验证云原生核心特性
  • 2025年- H121-Lc28. 找出字符串中第一个匹配项的下标(数组)--Java版
  • 【底层机制】auto 关键字的底层实现机制
  • 【代码随想录算法训练营——Day6(Day5周日休息)】哈希表——242.有效的字母异位词、349.两个数组的交集、202.快乐数、1.两数之和
  • leedcode 算法刷题第二八天
  • KafKa教程
  • 如何在 Ubuntu 22.04 中安装 Docker 引擎和 Linux 版 Docker Desktop 桌面软件
  • 基于RK3568/RK3588+全隔离串口+多电力协议接入电力网关机,用于新能源光伏风能等电站监测运维
  • 软件测试用例(沉淀中)
  • 华清远见25072班网络编程学习day1
  • 【Python办公】[ 网络剪切板 ]免费图床工具GUI界面打包(电脑上传-手机扫码下载)
  • [吾爱原创] 【游戏】王富贵的果菜园
  • Linux系统:线程同步与生产消费模型
  • 深入理解 IP 协议
  • NTP配置为客户端广播监听模式