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

c++的vector用法

文章目录

      • 1. 创建和初始化 `std::vector`
      • 2. 添加和删除元素
      • 3. 访问和遍历元素
      • 4. `std::vector` 的其他常用操作

std::vector 是 C++ 标准库中的一个动态数组容器,提供了灵活的存储和访问功能

1. 创建和初始化 std::vector

#include <iostream>
#include <vector>int main() {// 创建一个空的 vectorstd::vector<int> v1;// 使用初始值创建 vectorstd::vector<int> v2 = {1, 2, 3, 4, 5};// 创建一个指定大小的 vector,所有元素初始化为 0std::vector<int> v3(5);  // v3 中有 5 个元素,初始值为 0// 创建一个指定大小的 vector,并用特定值初始化所有元素std::vector<int> v4(5, 10);  // v4 中有 5 个元素,所有元素的值为 10// 输出 vector 的内容std::cout << "v2: ";for (int num : v2) {std::cout << num << " ";}std::cout << std::endl;std::cout << "v3: ";for (int num : v3) {std::cout << num << " ";}std::cout << std::endl;std::cout << "v4: ";for (int num : v4) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

// 使用初始值创建 vector
std::vector<int> v2 = {1, 2, 3, 4, 5};// 输出 vector 的内容
std::cout << "v2: ";
for (int num : v2) {std::cout << num << " ";
}
std::cout << std::endl;
  1. 创建 vector
std::vector<int> v2 = {1, 2, 3, 4, 5};
  • 步骤

    • 这里使用了 std::vector,它是一个动态数组,可以存储多个同类型的数据。
    • v2 被初始化为一个包含五个整数(1, 2, 3, 4, 5)的 vector
  • 调用过程

    • C++ 的标准库中 std::vector 构造函数被调用,传入一个初始化列表 {1, 2, 3, 4, 5}
    • v2 现在拥有五个元素,分别是 1, 2, 3, 4, 5。
  1. 输出 vector 的内容

2.1 输出头部信息

std::cout << "v2: ";
  • 步骤

    • std::cout 是标准输出流,用于将信息输出到控制台。
    • "v2: " 是一个字符串,表示要输出的内容。
  • 调用过程

    • 调用 std::coutoperator<< 函数,传递字符串 "v2: "
    • 字符串被输出到控制台。

2.2 遍历 vector 并输出元素

for (int num : v2) {std::cout << num << " ";
}
  • 步骤

    • for (int num : v2) 是范围-based 循环,遍历 v2 中的每个元素。
    • num 是循环变量,代表当前遍历到的元素。
  • 调用过程

    • 编译器生成隐式的迭代器来遍历 v2 的元素。
    • 对于 v2 中的每一个元素,执行 std::cout << num << " ";
      • num 被赋值为当前的元素值(例如第一次循环时是 1,第二次是 2,以此类推)。
      • 调用 std::coutoperator<< 函数,将 num 的值输出到控制台。
      • 再次调用 std::coutoperator<< 函数,将一个空格 " " 输出到控制台。
  • 执行的顺序

    • 第一次循环:num = 1,输出 1 (后面有个空格)。
    • 第二次循环:num = 2,输出 2 (后面有个空格)。
    • 第三次循环:num = 3,输出 3 (后面有个空格)。
    • 第四次循环:num = 4,输出 4 (后面有个空格)。
    • 第五次循环:num = 5,输出 5 (后面有个空格)。
  1. 输出换行
std::cout << std::endl;
  • 步骤

    • std::endl 是一个操控符,表示输出一个换行符并刷新输出流。
  • 调用过程

    • 调用 std::coutoperator<< 函数,传递 std::endl
    • std::endl 将换行符插入到输出流中,并调用 flush 方法,确保所有输出立即显示在控制台。

总结

  1. 创建 vector:初始化 v2 为一个包含 1, 2, 3, 4, 5 的动态数组。
  2. 输出内容
    • 输出字符串 "v2: "
    • 遍历 v2 中的每个元素,依次输出每个元素及其后面一个空格。
  3. 换行:最后输出一个换行符。

最终,控制台将显示如下内容:

v2: 1 2 3 4 5 

2. 添加和删除元素

#include <iostream>
#include <vector>int main() {std::vector<int> v = {1, 2, 3};// 在末尾添加元素v.push_back(4);v.push_back(5);// 删除末尾元素v.pop_back();// 在指定位置插入元素v.insert(v.begin() + 1, 10);  // 在索引 1 的位置插入 10// 删除指定位置的元素v.erase(v.begin() + 2);  // 删除索引 2 位置的元素// 输出 vector 的内容std::cout << "v: ";for (int num : v) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

  1. #include <iostream>
  • 含义:包含输入输出流库,以便使用 std::cout 进行输出。
  • 执行过程:预处理器指令,将 iostream 头文件的内容插入到当前文件中,以提供输入输出功能。
  1. #include <vector>
  • 含义:包含 std::vector 容器的定义,以便使用 vector 类。
  • 执行过程:预处理器指令,将 vector 头文件的内容插入到当前文件中,以提供动态数组功能。
  1. int main() {
  • 含义:程序的入口点,主函数的定义。
  • 执行过程:程序开始执行从 main 函数开始的代码。
  1. std::vector<int> v = {1, 2, 3};
  • 含义:创建一个名为 vstd::vector<int> 对象,并初始化为包含元素 1, 2, 3 的 vector
  • 执行过程
    • 调用 std::vector<int> 的构造函数,传入初始化列表 {1, 2, 3}
    • v 现在包含三个整数元素:1, 2, 3。
  1. v.push_back(4);
  • 含义:在 vector 的末尾添加一个新元素 4。
  • 执行过程
    • 调用 std::vector<int>push_back 方法,传入整数 4。
    • 4 被添加到 v 的末尾,v 现在包含元素:1, 2, 3, 4。
  1. v.push_back(5);
  • 含义:在 vector 的末尾添加一个新元素 5。
  • 执行过程
    • 调用 std::vector<int>push_back 方法,传入整数 5。
    • 5 被添加到 v 的末尾,v 现在包含元素:1, 2, 3, 4, 5。
  1. v.pop_back();
  • 含义:删除 vector 末尾的一个元素。
  • 执行过程
    • 调用 std::vector<int>pop_back 方法。
    • 删除 v 末尾的元素 5,v 现在包含元素:1, 2, 3, 4。

8. v.insert(v.begin() + 1, 10);起到中间添加元素的作用

  • 含义:在 vector 的指定位置(索引 1)插入新元素 10。
  • 执行过程
    • 调用 std::vector<int>insert 方法。
    • v.begin() 返回一个指向 v 第一个元素的迭代器。v.begin() + 1 表示第二个位置的迭代器。
    • 插入元素 10 到索引 1 位置,v 现在包含元素:1, 10, 2, 3, 4。

9. v.erase(v.begin() + 2);中间删除元素的作用

  • 含义:删除 vector 中指定位置(索引 2)的元素。
  • 执行过程
    • 调用 std::vector<int>erase 方法。
    • v.begin() + 2 表示第三个位置的迭代器。
    • 删除元素 2,v 现在包含元素:1, 10, 3, 4。
  1. std::cout << "v: ";
  • 含义:输出字符串 "v: " 到控制台。
  • 执行过程
    • 调用 std::coutoperator<< 函数,传递字符串 "v: "
    • 字符串被输出到控制台。
  1. for (int num : v) { std::cout << num << " "; }
  • 含义:遍历 vector 中的每个元素,并将其输出到控制台。
  • 执行过程
    • for (int num : v) 是一个范围-based 循环,遍历 v 中的每个元素。
    • 对于每个元素,num 被赋值为当前元素值。
    • 调用 std::coutoperator<< 函数,将 num 输出到控制台,再输出一个空格 " "
    • 遍历 v 中的所有元素,依次输出 1, 10, 3, 4。
  1. std::cout << std::endl;
  • 含义:输出一个换行符,并刷新输出流。
  • 执行过程
    • 调用 std::coutoperator<< 函数,传递 std::endl
    • std::endl 输出换行符,并调用 flush 方法,确保所有输出立即显示在控制台。
  1. return 0;
  • 含义:结束 main 函数,返回 0 表示程序成功执行。
  • 执行过程
    • 返回 0 给操作系统,表示程序正常结束。

总结

  1. 初始化 vector:创建并初始化 v{1, 2, 3}
  2. 修改 vector
    • 添加元素 4 和 5。
    • 删除末尾的元素 5。
    • 在索引 1 插入元素 10。
    • 删除索引 2 位置的元素 2。
  3. 输出 vector 内容:打印 v 中的每个元素,输出 1 10 3 4

最终,控制台将显示如下内容:

v: 1 10 3 4 

3. 访问和遍历元素

#include <iostream>
#include <vector>int main() {std::vector<int> v = {1, 2, 3, 4, 5};// 使用索引访问元素std::cout << "Element at index 2: " << v[2] << std::endl;// 使用 at() 方法访问元素std::cout << "Element at index 3: " << v.at(3) << std::endl;// 使用迭代器遍历元素std::cout << "v elements: ";for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;// 使用范围-based for 循环遍历元素std::cout << "v elements (range-based): ";for (int num : v) {std::cout << num << " ";}std::cout << std::endl;return 0;
}


  1. 包含头文件
#include <iostream>
#include <vector>
  • 含义:引入标准输入输出流和向量容器的头文件,以便在程序中使用相应的类和函数。
  1. 创建并初始化 vector
std::vector<int> v = {1, 2, 3, 4, 5};
  • 含义:创建一个 vector 容器 v,并初始化为包含 1, 2, 3, 4, 5 这几个整数元素。
  1. 使用索引和 at() 访问元素
std::cout << "Element at index 2: " << v[2] << std::endl;
std::cout << "Element at index 3: " << v.at(3) << std::endl;
  • 含义:分别使用索引和 at() 方法访问 vector 中的元素。
  • 执行过程
    • v[2] 返回索引为 2 的元素,即第三个元素。
    • v.at(3) 返回索引为 3 的元素,即第四个元素。
  • 注意at() 方法会进行边界检查,当访问越界时会抛出 std::out_of_range 异常。
  1. 使用迭代器遍历元素
std::cout << "v elements: ";
for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) {std::cout << *it << " ";
}
std::cout << std::endl;
  • 含义:使用迭代器遍历 vector 容器中的元素。
  • 执行过程
    • v.begin() 返回指向容器起始位置的迭代器。
    • v.end() 返回指向容器末尾位置的迭代器。
    • 在循环中,通过 *it 访问迭代器指向的元素。

在使用迭代器遍历元素时,通过 *it 访问迭代器指向的元素,本质上是通过指针来进行访问的。

具体来说:

  1. 迭代器本质上是一个指针,指向容器中的某个元素。

  2. 当我们使用 v.begin()v.end() 获取迭代器时,实际上得到的是指向容器第一个元素和最后一个元素后面的位置的指针。

  3. 在遍历过程中,通过 ++it 来移动迭代器,实际上是在移动指针,让它指向下一个元素。

  4. 当我们使用 *it 访问迭代器指向的元素时,实际上是通过解引用指针来获取该元素的值。

所以,使用迭代器遍历元素的本质就是通过指针来访问容器中的元素。迭代器提供了一种更加安全和易用的方式来遍历容器,但其底层实现确实是基于指针的访问机制。


  1. 使用范围-based for 循环遍历元素
std::cout << "v elements (range-based): ";
for (int num : v) {std::cout << num << " ";
}
std::cout << std::endl;
  • 含义:使用范围-based for 循环遍历 vector 容器中的元素。
  • 执行过程:对于容器 v 中的每个元素,将其值赋给 num,然后输出到控制台。
  1. 总结

这段代码展示了如何使用向量容器(vector)存储整数元素,并演示了如何通过索引、at() 方法、迭代器和范围-based for 循环访问和遍历向量的元素。


4. std::vector 的其他常用操作

下面是对你提供的 C++ 代码逐行解释,并附上每一行的输出结果:

#include <iostream>   // 包含输入输出流库
#include <vector>     // 包含向量库int main() {std::vector<int> v = {1, 2, 3, 4, 5};  // 创建一个整数向量 v,初始值为 1, 2, 3, 4, 5// 获取 vector 的大小std::cout << "Size of v: " << v.size() << std::endl;// 输出结果: Size of v: 5// 解释: v.size() 返回向量 v 的当前大小,即其中元素的个数。此时,v 包含 5 个元素。// 获取 vector 的容量std::cout << "Capacity of v: " << v.capacity() << std::endl;// 输出结果: Capacity of v: 5// 解释: v.capacity() 返回向量 v 的当前容量,即 v 能够容纳的元素的最大个数而不需要重新分配内存。初始时,它的容量等于大小。// 重新调整 vector 的大小v.resize(7, 100);  // 将 vector 调整为 7 个元素,新增的元素初始化为 100// 清空 vectorv.clear();  // 清空 v 中的所有元素std::cout << "Size of v after clear: " << v.size() << std::endl;// 输出结果: Size of v after clear: 0// 解释: v.clear() 会移除向量中的所有元素,v.size() 返回清空后的大小,即 0。return 0;
}

逐行解释

  1. #include <iostream>

    • 含义: 包含输入输出流库,以便使用 std::coutstd::endl
  2. #include <vector>

    • 含义: 包含 std::vector 类的定义,以便使用 std::vector 容器。
    • 效果: 使得程序可以使用 std::vector 类型来管理动态数组。
  3. int main()

    • 含义: main 函数是程序的入口点。所有 C++ 程序都从 main 函数开始执行。
    • 效果: 程序从这里开始运行。
  4. std::vector<int> v = {1, 2, 3, 4, 5};

    • 含义: 创建一个 std::vector<int> 类型的变量 v,并初始化为 {1, 2, 3, 4, 5}
    • 效果: v 是一个包含 5 个整数的向量,元素依次是 1, 2, 3, 4, 5。
  5. std::cout << "Size of v: " << v.size() << std::endl;

    • 含义: 输出向量 v 的大小。v.size() 返回向量的元素个数。
    • 输出结果: Size of v: 5
    • 解释: 向量 v 目前包含 5 个元素,所以大小为 5。
  6. std::cout << "Capacity of v: " << v.capacity() << std::endl;

    • 含义: 输出向量 v 的容量。v.capacity() 返回向量可以容纳的最大元素个数而不需要重新分配内存
    • 输出结果: Capacity of v: 5
    • 解释: 向量的初始容量与其大小相等,即 5。容量可能会根据实现和分配策略有所不同,但在这里,大小和容量相同。
  7. v.resize(7, 100);

    • 含义: 调整向量 v 的大小为 7。如果新的大小大于当前大小,则用 100 初始化新增的元素。
    • 效果: 向量 v 的大小变为 7,原有的元素保持不变,新增的元素值为 100。
    • 解释: 向量的内容变为 {1, 2, 3, 4, 5, 100, 100}
  8. v.clear();

    • 含义: 清空向量 v 中的所有元素。
    • 效果: 向量 v 的所有元素被移除,大小变为 0。
    • 解释: 向量被清空,所有元素都被删除,但容量 (capacity) 可能不变。
  9. std::cout << "Size of v after clear: " << v.size() << std::endl;

    • 含义: 输出向量 v 在清空后的大小。
    • 输出结果: Size of v after clear: 0
    • 解释: 清空后,向量 v 不再包含任何元素,所以大小为 0。

总结

  • v.size(): 返回向量的当前大小,即元素个数。
  • v.capacity(): 返回向量的容量,即能容纳的最大元素个数而无需重新分配内存。
  • v.resize(new_size, value): 调整向量的大小至 new_size如果新大小大于当前大小,新增元素会初始化为 value
  • v.clear(): 移除向量中的所有元素,清空向量,但容量可能保持不变。

相关文章:

c++的vector用法

文章目录 1. 创建和初始化 std::vector2. 添加和删除元素3. 访问和遍历元素4. std::vector 的其他常用操作 std::vector 是 C 标准库中的一个动态数组容器&#xff0c;提供了灵活的存储和访问功能。 1. 创建和初始化 std::vector #include <iostream> #include <vect…...

【Linux网络】Linux网络初探:开启网络世界的大门

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; 前言&#xff1a;我们已经系统的学习了Linux的基本操作、进程、线程、文件、通信等待&#xff0c;但是在如今社会没有网络通信方式是万万不行的&#xff0c;今天我们就走进网络中&#xff0c;系统的学习一下有关Linux网…...

目录、用户与组、出错相关函数、时间函数

一、目录相关函数及属性 1、 opendir()函数 opendir 用于打开一个目录&#xff0c;并返回一个目录流指针。name&#xff1a;要打开的目录的路径。 返回值&#xff1a;成功时返回指向目录流的指针&#xff0c;失败时返回 NULL。 #include <dirent.h> DIR *opendir(con…...

<keep-alive> 一分钟了解

<keep-alive> 一分钟了解 <keep-alive> 是 Vue.js 提供的一个抽象组件&#xff0c;它的主要用途是在页面或组件切换时保留其状态&#xff0c;避免重复执行昂贵的渲染操作&#xff0c;从而提升应用性能。 文章目录 <keep-alive> 一分钟了解 一、 <keep-ali…...

Android 启动动画太生硬

跟 android:launchMode"singleTask"属性无关系 请禁用路由 ARouter.getInstance() .build(Routes.Main.MAIN) .withTransition(R.anim.activity_anim_in, R.anim.activity_anim_out).navigation() 正确做法是 val intent Intent(thisSplashActivity,MainActivit…...

深度学习中常用概念总结

最近在做深度学习&#xff0c;里面涉及到很多概念&#xff0c;有的名称都差不多容易记混。所以写这篇文章总结一下。眼过千遍不如手过一遍。 1. 轮数&#xff08;Epochs&#xff09;: 一轮&#xff08;Epoch&#xff09;指的是整个训练数据集在训练过程中被完整使用一次。…...

进 程

1.进程&#xff1a;进行中的程序。 微观串行&#xff0c;宏观并行。 程序的一次执行过程 进程是程序的一个实例 一个程序可以对应一个或多个进程。 2.为什么需要进程&#xff1f; 3.进程的组成部分&#xff1a; 进程 pcb 块 栈|堆|bss|data|text 其中&#xff1a; 家族…...

Taro-UI

一、安装Taro UI 进入项目文件&#xff0c;执行项目 //使用yarn安装taro-ui yarn add taro-ui//使用npm安装taro-ui npm install taro-ui//注&#xff1a;因为要支持自定义主题功能&#xff0c;需要将样式从组件中抽离出来&#xff0c;在微信小程序中依赖 globalClass 功能&a…...

TypeScript 之 JavaScript文件类型检查

启用对 JavaScript 文件的类型检查 在 TypeScript 编译选项 compilerOptions 全部配置项 中&#xff0c;可以通过以下2个属性配置 JavaScript Support&#xff1a; allowJs 是否允许编译 JavaScript 文件。默认值是 false。在默认情况下&#xff0c;TypeScript 编译器只处理 .…...

基本数据类型变量间的自动提升与强制转换以及进制的转换

基本数据类型变量间的自动提升与强制转换 测试基本数据类型的运算规则 这里基本类型不包括布尔 运算规则 自动类型提升 当容量小的变量与容量大的变量做运算时&#xff0c;结果自动转换容量大的数据类型 说明&#xff1a;此时容量大小&#xff0c;指的是数据范围大小&…...

SparseConv 的学习笔记

安装 环境设置在74.183 sdfstudio 里面,SparseNeus 推荐的版本是是 torchsparse 2.0.0版本 命令行如下&#xff1a; 需要 C 的 sudo 权限指定安装&#xff1a; ## 安装依赖项 conda install -c conda-forge sparsehash sudo apt-get install libsparsehash-dev 进入官网下…...

vscode 快速生成vue 格式

1.用快捷Ctrl Shift P唤出控制台 输入“Snippets”并选择 Snippets: Configure User Snippets 2.输入vue&#xff0c;选中vue.json vs code自动生成vue.json文件 3.在 vue.json 中添加模板 {"Print to console": {"prefix": "vue2","b…...

react笔记:redux

redux状态管理 安装redux&#xff1a;num i redux 新建redux文件夹&#xff1a; store.jscount_reducer.js count_action.js constant.js (常量&#xff09; 1. store.js文件&#xff1a; // 该文件专门用于暴露一个store对象&#xff0c;整个应用只有一个store对…...

数据结构与算法--图的应用

文章目录 回顾提要连通图生成树最小生成树构造最小生成树的算法普里姆(Prim)算法克鲁斯卡尔(Kruskal)算法 最短路径狄杰斯特拉 (Dijkstra) 算法当前最短路径的更新拓扑排序拓扑排序方法拓扑排序示例总结 回顾 图的遍历方法&#xff1a; 深度优先遍历 (DFS)&#xff1a;从任意…...

【leetcode图文详解】特殊数组II : 空间换时间的“记忆化”,越多越好吗?

题目详解 需求&#xff1a;判断给定区间内的元素是否满足“特殊数组”要求 尝试: 暴力求解? 如果试着直接对每个queries中的区间进行检测而不做其他处理&#xff0c;那么最后不出意外地超时了。。 细想优化策略&#xff0c;不难察觉到其中可能存在大量的重复运算 那还等什…...

离线安装prometheus与Grafana实现可视化监控

简介 prometheus 是一个专为云环境设计的开源系统监控和警报工具&#xff0c;它收集并存储多维度的时间序列数据&#xff0c;通过PromQL查询语言提供强大的数据检索能力&#xff0c;并支持可视化及警报功能。而 Grafana 则是一个开源的数据可视化平台&#xff0c;能够与包括Pr…...

【Python学习-UI界面】PyQt5 小部件7-QSpinBox 计数器

样式如下: 一个 QSpinBox 对象向用户呈现一个文本框&#xff0c;右侧有一个上下按钮&#xff0c;显示一个整数。如果按下上下按钮&#xff0c;文本框中的值将增加/减少。 默认情况下&#xff0c;框中的整数从0开始&#xff0c;最高到99&#xff0c;并以步长1变化。对于浮点数…...

[二次元]个人主页搭建

文章目录 域名买一个免费的 框架HexoHexo-Theme-ParticleX Halo 参考 域名 买一个 有钱人玩这个 免费的 github.io 教程在github官方文档有&#xff1b; 框架 Hexo 静态的 Hexo-Theme-ParticleX Argvchsの小窝 Halo 动态的 halo 参考 基于Hexo框架的GitHub个人主页…...

Spring Data JPA 自动创建时间的相关注解和用法

以Springboot项目为例 在实体类上加上注解 EntityListeners(AuditingEntityListener.class)在相应的字段上添加对应的时间注解 LastModifiedDate 和 CreatedDateApplication启动类中添加注解 EnableJpaAuditing...

Java基础之隐式类型转换

类型转换 基本数据类型表示范围大小排序&#xff1a; 在变量赋值及算术运算的过程中&#xff0c;经常会用到数据类型转换&#xff0c;其分为两类&#xff1a; 隐式类型转换 显式类型转换 1 隐式类型转换 情形1&#xff1a;赋值过程中&#xff0c;小数据类型值或变量可以直…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...