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

C++之STL整理(2)之vector超详用法整理

C++之STL整理(2)之vector用法(创建、赋值、方法)整理

注:整理一些突然学到的C++知识,随时mark一下
例如:忘记的关键字用法,新关键字,新数据结构


C++ 的vector用法整理

  • C++之STL整理(2)之vector用法(创建、赋值、方法)整理
  • 一、vector的初始化
    • 1、默认构造函数
    • 2、拷贝构造函数copy区间
    • 3、指定数量和元素值的构造函数
    • 4、指定数量的构造函数
    • 5、拷贝构造函数
  • 二、vector的初始化-赋值
    • 1、.assign(beg, end) 赋值操作
    • 2、.assign(n, elem) 赋值操作
    • 3、重载等号操作符 operator=
    • 4、直接列表初始化 `Vector<T> {,};`
    • 5、swap 函数
  • 三、数据得增删查改
    • 1、at(int id)接口
    • 2、front()接口
    • 3、back()接口
    • 4、[id]直接取
    • 5、插入函数
    • 6、尾部添加 push_back(ele)
    • 7、尾部删去 pop_back()
    • 8、删区间
    • 9、删指定位置
    • 10、清空
  • 四、其他接口
    • 1、size()成员函数
    • 2、empty()
    • 3、resize(int num)
    • 4、capacity()
    • 5、reserve(int len)
  • 总结


提示:本文为 C++ 中 vector构造、赋值、接口 的写法和举例


一、vector的初始化

  根据vector的以下封装好的构造函数,现在示例每种构造方式的创建:

vector构造函数:vector<T> v; //默认构造函数
vector(v.begin(), v.end());//将v[begin(), end())区间中的元素copy给对象。
vector(n, elem);//构造函数将n个elem赋给对象。
vector(n);//构造函数将n个0或空赋值给对象。
vector(const vector &vec);//拷贝构造函数。

1、默认构造函数

创建一个空的vector。

#include <iostream>  
#include <vector>  int main() {  std::vector<int> v; // 创建一个空的vector  std::cout << "Size of vector v: " << v.size() << std::endl; // 输出:Size of vector v: 0  return 0;  
}

2、拷贝构造函数copy区间

假设有一个已存在的vector,我们想要创建一个新的vector并拷贝其中一部分元素。

#include <iostream>  
#include <vector>  int main() {  std::vector<int> v = {1, 2, 3, 4, 5};  std::vector<int> v2(v.begin(), v.begin() + 3); // 拷贝前3个元素  for (int num : v2) {  std::cout << num << " "; // 输出:1 2 3  }  std::cout << std::endl;  return 0;  
}

3、指定数量和元素值的构造函数

创建一个包含特定数量且所有元素都具有相同值的vector。

#include <iostream>  
#include <vector>  int main() {  std::vector<int> v(5, 10); // 创建一个包含5个10的vector  for (int num : v) {  std::cout << num << " "; // 输出:10 10 10 10 10  }  std::cout << std::endl;  return 0;  
}

4、指定数量的构造函数

创建一个包含特定数量的vector,所有元素默认初始化为该类型的默认值(对于基本类型如int,默认值为0)。

#include <iostream>  
#include <vector>  int main() {  std::vector<int> v(5); // 创建一个包含5个0的vector  for (int num : v) {  std::cout << num << " "; // 输出:0 0 0 0 0  }  std::cout << std::endl;  return 0;  
}

5、拷贝构造函数

从另一个已存在的vector创建一个新的vector,作为它的拷贝。

#include <iostream>  
#include <vector>  int main() {  std::vector<int> v = {1, 2, 3, 4, 5};  std::vector<int> v2(v); // 使用拷贝构造函数创建v2,它是v的拷贝  for (int num : v2) {  std::cout << num << " "; // 输出:1 2 3 4 5  }  std::cout << std::endl;  return 0;  
}

二、vector的初始化-赋值

vector常用赋值方式:
assign(beg, end);//将[beg, end)区间中的数据拷贝赋值。
assign(n, elem);//将n个elem拷贝赋值。
vector& operator=(const vector  &vec);//重载=
Vector<T> = {,,,};//直接赋值一个数组
Vector<T>  {,,,};
swap(vec);// 与vec的元素互换。

1、.assign(beg, end) 赋值操作

使用区间迭代器将另一个容器或数组中的数据拷贝到vector中。

#include <iostream>  
#include <vector>  
#include <algorithm> // for std::next  int main() {  std::vector<int> v = {1, 2, 3, 4, 5};  int arr[] = {6, 7, 8, 9, 10};  v.assign(std::begin(arr), std::end(arr)); // 赋值arr数组到v  for (int num : v) {  std::cout << num << " "; // 输出:6 7 8 9 10  }  std::cout << std::endl;  return 0;  
}

2、.assign(n, elem) 赋值操作

将n个值为elem的元素拷贝到vector中。

#include <iostream>  
#include <vector>  int main() {  std::vector<int> v;  v.assign(5, 10); // 赋值5个10到v  for (int num : v) {  std::cout << num << " "; // 输出:10 10 10 10 10  }  std::cout << std::endl;  return 0;  
}

3、重载等号操作符 operator=

使用重载的等号操作符将一个vector的内容赋给另一个vector。

#include <iostream>  
#include <vector>  int main() {  std::vector<int> v1 = {1, 2, 3, 4, 5};  std::vector<int> v2;  v2 = v1; // 使用重载的等号操作符赋值v1到v2  for (int num : v2) {  std::cout << num << " "; // 输出:1 2 3 4 5  }  std::cout << std::endl;  return 0;  
}

4、直接列表初始化 Vector<T> {,};

在创建vector对象时,直接使用列表初始化语法。

#include <iostream>  
#include <vector>  int main() {  std::vector<int> v = {21, 22, 23, 24, 25}; // 直接列表初始化  for (int num : v) {  std::cout << num << " "; // 输出:21 22 23 24 25  }  std::cout << std::endl;  return 0;  
}

5、swap 函数

使用std::swap或vector的成员函数swap来交换两个vector的内容。

#include <iostream>  
#include <vector>  
#include <algorithm> // for std::swap  int main() {  std::vector<int> v1 = {1, 2, 3};  std::vector<int> v2 = {4, 5, 6};  std::swap(v1, v2); // 使用std::swap交换v1和v2的内容  // 输出交换后的v1  for (int num : v1) {  std::cout << num << " "; }std::cout << std::endl;  return 0;
}

三、数据得增删查改

vector数据存取操作,主要有at()、front()、back()接口和括号[]取得方法。
vector插入和删除操作,主要有insert、erase、clear、pushback、popback接口。

1、at(int id)接口

at成员函数用于通过索引访问元素,并且在索引越界时会抛出std::out_of_range异常。

#include <iostream>  
#include <vector>  
#include <stdexcept> // for std::out_of_range  int main() {  std::vector<int> v = {10, 20, 30, 40, 50};  try {  std::cout << v.at(2) << std::endl; // 输出:30  std::cout << v.at(10) << std::endl; // 抛出std::out_of_range异常  } catch (const std::out_of_range& e) {  std::cerr << "Index out of range: " << e.what() << std::endl;  }  return 0;  
}

2、front()接口

front成员函数返回容器中第一个元素的引用。

#include <iostream>  
#include <vector>  int main() {  std::vector<int> v = {10, 20, 30, 40, 50};  std::cout << v.front() << std::endl; // 输出:10  return 0;  
}

3、back()接口

back成员函数返回容器中最后一个元素的引用。

#include <iostream>  
#include <vector>  int main() {  std::vector<int> v = {10, 20, 30, 40, 50};  std::cout << v.back() << std::endl; // 输出:50  return 0;  
}

4、[id]直接取

operator[]通过索引直接访问元素,如果越界,行为是未定义的(通常会导致程序崩溃)。

#include <iostream>  
#include <vector>  int main() {  std::vector<int> v = {10, 20, 30, 40, 50};  std::cout << v[2] << std::endl; // 输出:30  // std::cout << v[10] << std::endl; // 未定义行为,通常会导致程序崩溃  return 0;  
}

5、插入函数

insert(const_iterator pos, int count, ele)在迭代器pos指向的位置插入count个值为ele的元素。

#include <iostream>  
#include <vector>  int main() {  std::vector<int> v = {10, 20, 40, 50};  v.insert(v.begin() + 1, 2, 30); // 在索引1的位置插入2个30  for (int num : v) {  std::cout << num << " "; // 输出:10 30 30 20 40 50  }  std::cout << std::endl;  return 0;  
}

6、尾部添加 push_back(ele)

在容器的尾部插入一个元素ele。

#include <iostream>  
#include <vector>  int main() {  std::vector<int> v = {10, 20, 30};  v.push_back(40); // 在尾部插入40  for (int num : v) {  std::cout << num << " "; // 输出:10 20 30 40  }  std::cout << std::endl;  return 0;  
}

7、尾部删去 pop_back()

删去容器的最后一个元素。

#include <iostream>  
#include <vector>  int main() {  std::vector<int> v = {10, 20, 30, 40};v.pop_back(); // 删除最后一个元素40  for (int num : v) {  std::cout << num << " "; // 输出:10 20 30  }  std::cout << std::endl;  return 0;  
}

8、删区间

erase(const_iterator start, const_iterator end)删去从迭代器start到end(不包括end)之间的所有元素。

#include <iostream>  
#include <vector>  int main() {  std::vector<int> v = {10, 20, 30, 40, 50};  v.erase(v.begin() + 1, v.begin() + 3); // 删除索引1到2之间的元素(即20和30)  for (int num : v) {  std::cout << num << " "; // 输出:10 40 50  }  std::cout << std::endl;  return 0;  
}

9、删指定位置

erase(const_iterator pos)删除迭代器pos指向的元素。

#include <iostream>  
#include <vector>  int main() {  std::vector<int> v = {10, 20, 30, 40, 50};  v.erase(v.begin() + 2); // 删除索引2的元素(即30)  for (int num : v) {  std::cout << num << " "; // 输出:10 20 40 50  }  std::cout << std::endl;  return 0;  
}

10、清空

clear()删掉容器中的所有元素。

#include <iostream>  
#include <vector>  int main() {  std::vector<int> v = {10, 20, 30, 40, 50};  v.clear(); // 删除所有元素  if (v.empty()) {  std::cout << "Vector is empty." << std::endl; // 输出:Vector is empty.  }  return 0;  
}

这些操作提供了对vector容器内容的灵活操作,可以轻松地插入和删除元素,以满足程序的需要。使用迭代器(或索引)时,请确保它们指向有效的容器位置,以避免未定义行为或异常。

四、其他接口

1、size()成员函数

返回容器中的元素个数。这个数量等于当前vector实际包含的元素数。

#include <iostream>  
#include <vector>  int main() {  std::vector<int> v = {10, 20, 30, 40, 50};  std::cout << "Size of vector: " << v.size() << std::endl; // 输出:Size of vector: 5  return 0;  
}

2、empty()

empty成员函数检查容器是否为空。如果容器中没有元素,它返回true;否则返回false。

#include <iostream>  
#include <vector>  int main() {  std::vector<int> v;  if (v.empty()) {  std::cout << "Vector is empty." << std::endl; // 输出:Vector is empty.  } else {  std::cout << "Vector is not empty." << std::endl;  }  return 0;  
}

3、resize(int num)

resize成员函数用于改变容器的大小。如果新的大小num大于当前大小,则容器会增长,新添加的元素会被初始化为默认值(对于内置类型,通常是0)。如果num小于当前大小,则末尾超出的元素会被删除。

#include <iostream>  
#include <vector>  int main() {  std::vector<int> v = {10, 20, 30};  v.resize(5); // 容器增长,新元素初始化为0  for (int num : v) {  std::cout << num << " "; // 输出:10 20 30 0 0  }  std::cout << std::endl;  v.resize(2); // 容器缩短,超出的元素被删除  for (int num : v) {  std::cout << num << " "; // 输出:10 20  }  std::cout << std::endl;  return 0;  
}

resize(int num, elem) 是resize的另一种重载形式。它允许你为新的元素指定一个初始值elem。如果容器增长,新添加的元素会被初始化为elem。

#include <iostream>  
#include <vector>  int main() {  std::vector<int> v = {10, 20, 30};  v.resize(5, 42); // 容器增长,新元素初始化为42  for (int num : v) {  std::cout << num << " "; // 输出:10 20 30 42 42  }  std::cout << std::endl;  return 0;  
}

4、capacity()

capacity成员函数返回容器当前分配的存储空间大小。这通常大于或等于size返回的值,因为vector为了效率可能会预留一些额外的空间。

#include <iostream>  
#include <vector>  int main() {  std::vector<int> v = {10, 20, 30};  std::cout << "Size: " << v.size() << ", Capacity: " << v.capacity() << std::endl;  // 输出可能类似于:Size: 3, Capacity: 3 或 Size: 3, Capacity: 4(取决于实现)  return 0;  
}

5、reserve(int len)

reserve成员函数用于预分配容器的存储空间。它并不改变容器的大小(即size的值不变),但会增加容器的capacity。预分配空间可以提高插入元素的效率,因为当容器需要增长时,它可能不需要重新分配整个存储空间。reserve成员函数用于预分配容器的存储空间,它可以帮助提高插入元素的效率,因为当容器需要增长时,如果已经有足够的预留空间,它就可以避免重新分配整个存储空间。

这里是一个更详细的例子,展示了如何使用reserve来预分配vector的存储空间:

#include <iostream>  
#include <vector>  int main() {  std::vector<int> v;  // 初始时,size和capacity都是0  std::cout << "Initial size: " << v.size() << ", Initial capacity: " << v.capacity() << std::endl;  // 使用reserve预分配至少10个元素的存储空间  v.reserve(10);  // size仍然是0,因为我们没有添加任何元素  // 但capacity至少为10  std::cout << "After reserve, size: " << v.size() << ", Capacity: " << v.capacity() << std::endl;  // 添加元素,直到达到或超过预留的capacity  for (int i = 0; i < 15; ++i) {  v.push_back(i);  }  // size现在是15,因为我们添加了15个元素  // capacity可能已经增长,以容纳更多的元素  std::cout << "After adding elements, size: " << v.size() << ", Capacity: " << v.capacity() << std::endl;  return 0;  
}

输出可能类似于:

Initial size: 0, Initial capacity: 0  
After reserve, size: 0, Capacity: 10  
After adding elements, size: 15, Capacity: 20 (或更大,取决于实现)

capacity的确切值可能因不同的vector实现而异。在上面的例子中,当添加超过预留capacity的元素时,vector可能会再次分配内存,并可能增加其capacity。这样做是为了避免在每次添加元素时都重新分配内存,从而提高性能。在实践中,如果你知道将要向vector中添加大量元素,使用reserve来预分配足够的空间通常是一个好习惯,因为这可以避免不必要的内存分配和元素复制。

总结

相关文章:

C++之STL整理(2)之vector超详用法整理

C之STL整理&#xff08;2&#xff09;之vector用法&#xff08;创建、赋值、方法&#xff09;整理 注&#xff1a;整理一些突然学到的C知识&#xff0c;随时mark一下 例如&#xff1a;忘记的关键字用法&#xff0c;新关键字&#xff0c;新数据结构 C 的vector用法整理 C之STL整…...

机器学习作业二之KNN算法

KNN&#xff08;K- Nearest Neighbor&#xff09;法即K最邻近法&#xff0c;最初由 Cover和Hart于1968年提出&#xff0c;是一个理论上比较成熟的方法&#xff0c;也是最简单的机器学习算法之一。该方法的思路非常简单直观&#xff1a;如果一个样本在特征空间中的K个最相似&…...

笔记81:在服务器中运行 Carla 报错 “Disabling core dumps.”

背景&#xff1a;使用实验室提供的服务器配 Carla-ROS2 联合仿真的实验环境&#xff0c;在安装好 Carla 后运行 ./CarlaUE4.sh 但是出现 Disabling core dumps. 报错&#xff0c;而且不会出现 Carla 的窗口&#xff1b; 解决&#xff1a;运行以下命令 ./CarlaUE4.sh -carl…...

ensp中pc机访问不同网络的服务器

拓扑图如下&#xff0c;资源已上传 说明&#xff1a;pc通过2个路由访问server服务器 三条线路分别是192.168.1.0网段&#xff0c;192.168.2.0网段和192.168.3.0网段&#xff0c;在未配置的情况下&#xff0c;pc设备是访问不到server的 具体操作流程 第一&#xff1b;pc设备…...

CSGO赛事管理系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目持续更新中..... 2024年计算机毕业论文&#xff08;设计&#xff09;学生选题参考合集推荐收藏&#xff08;包含Springboot、jsp、ssmvue等技术项目合集&#xff09; 目录 1. 系…...

win10微软拼音输入法 - bug - 在PATH变量为空的情况下,无法输入中文

文章目录 win10微软拼音输入法 - bug - 在PATH变量为空的情况下&#xff0c;无法输入中文概述笔记实验前提条件100%可以重现 - 无法使用win10拼音输入法输入中文替代的输入法软件备注备注END win10微软拼音输入法 - bug - 在PATH变量为空的情况下&#xff0c;无法输入中文 概述…...

Java安全篇-Fastjson漏洞

前言知识&#xff1a; 一、json 概念&#xff1a; json全称是JavaScript object notation。即JavaScript对象标记法&#xff0c;使用键值对进行信息的存储。 格式&#xff1a; {"name":"wenda","age":21,} 作用&#xff1a; JSON 可以作为…...

Flink系列之:Flink SQL Gateway

Flink系列之&#xff1a;Flink SQL Gateway 一、Flink SQL Gateway二、部署三、启动SQL Gateway四、运行 SQL 查询五、SQL 网关启动选项六、SQL网关配置七、支持的端点 一、Flink SQL Gateway SQL 网关是一项允许多个客户端从远程并发执行 SQL 的服务。它提供了一种简单的方法…...

Linux基础篇:解析Linux命令执行的基本原理

Linux 命令是一组可在 Linux 操作系统中使用的指令&#xff0c;用于执行特定的任务&#xff0c;例如管理文件和目录、安装和配置软件、网络管理等。这些命令通常在终端或控制台中输入&#xff0c;并以文本形式显示输出结果。 Linux 命令通常以一个或多个单词的简短缩写或单词…...

LeetCode-热题100:153. 寻找旋转排序数组中的最小值

题目描述 已知一个长度为 n 的数组&#xff0c;预先按照升序排列&#xff0c;经由 1 到 n 次 旋转 后&#xff0c;得到输入数组。例如&#xff0c;原数组 nums [0,1,2,4,5,6,7] 在变化后可能得到&#xff1a; 若旋转 4 次&#xff0c;则可以得到 [4,5,6,7,0,1,2] 若旋转 7 次…...

游戏客户客户端面经

C#和C的类的区别C# List添加100个Obj和100 int内存是怎么变化的重载和重写的区别&#xff0c;重载是怎么实现的重写是怎么实现的&#xff1f;虚函数表是类的还是对象的用过哪些C的STLVector底层是怎么实现的Vector添加一百次数据内存是怎么变化Map的底层&#xff0c;红黑树的查…...

网站业务对接DDoS高防

准备需要接入的网站域名清单&#xff0c;包含网站的源站服务器IP&#xff08;仅支持公网IP的防护&#xff09;、端口信息等。所接入的网站域名必须已完成ICP备案。如果您的网站支持HTTPS协议访问&#xff0c;您需要准备相应的证书和私钥信息&#xff0c;一般包含格式为.crt的公…...

Python-VBA编程500例-024(入门级)

字符串写入的行数(Line Count For String Writing)在实际应用中有着广泛的应用场景。常见的应用场景有&#xff1a; 1、文本编辑及处理&#xff1a;在编写或编辑文本文件时&#xff0c;如使用文本编辑器或文本处理器&#xff0c;经常需要处理字符串并确定其在文件中的行数。这…...

蓝桥杯 - 小明的背包1(01背包)

解题思路&#xff1a; 本题属于01背包问题&#xff0c;使用动态规划 dp[ j ]表示容量为 j 的背包的最大价值 注意&#xff1a; 需要时刻提醒自己dp[ j ]代表的含义&#xff0c;不然容易晕头转向 注意越界问题&#xff0c;且 j 需要倒序遍历 如果正序遍历 dp[1] dp[1 - vo…...

学习java第二十六天

Spring是一个开源框架&#xff0c;Spring是一个轻量级的Java 开发框架。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构&#xff0c;分层架构允许使用者选择使用哪一个组件&#xff0c;同时为 J2EE 应用程序开发提供集成的框架。Spring使用基本的…...

Go第三方框架--gin框架(二)

4. gin框架源码–Engine引擎和压缩前缀树的建立 讲了这么多 到标题4才开始介绍源码&#xff0c;主要原因还是想先在头脑中构建起 一个大体的框架 然后再填肉 这样不容易得脑血栓。标题四主要涉及标题2.3的步骤一 也就是 标题2.3中的 粗线框中的内容 4.1 Engine 引擎的建立 见…...

五分钟搞懂UDS刷写34/36/37服务(内含S19文件解读)

目录 34服务 36服务 37服务 S19文件介绍 理论太多总是让人头昏&#xff0c;通过举例的方法学习刷写是最好的办法&#xff0c;刷写中最重要的就是34/36/37服务之间的联动&#xff0c;在我当前的项目中37服务较为简单&#xff0c;等待36服务全部传输完成之后&#xff0c;发送…...

知识图谱智能问答系统技术实现

知识图谱是以一种结构化的方式存储和描述知识的数据集合&#xff0c;它将知识表示为节点和边的形式&#xff0c;并可以对这些节点和边进行有意义的存储、查询、连接和关系挖掘等操作。知识图谱不仅可以为人提供理解信息的能力&#xff0c;而且还能为机器提供对信息进行分析、推…...

【unity】如何汉化unity编译器

在【unity】如何汉化unity Hub这篇文章中&#xff0c;我们已经完成了unity Hub的汉化&#xff0c;现在让我们对unity Hub安装的编译器也进行下汉化处理。 第一步&#xff1a;在unity Hub软件左侧栏目中点击安装&#xff0c;选择需要汉化的编译器&#xff0c;再点击设置图片按钮…...

为什么Python不适合写游戏?

知乎上有热门个问题&#xff1a;Python 能写游戏吗&#xff1f;有没有什么开源项目&#xff1f; Python可以开发游戏&#xff0c;但不是好的选择 Python作为脚本语言&#xff0c;一般很少用来开发游戏&#xff0c;但也有不少大型游戏有Python的身影&#xff0c;比如&#xff1…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者&#xff0c;高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法&#xff0c;分为两大系列&#xff1a; 一、getElementBy... 系列 传统方法&#xff0c;直接通过 DOM 接口访问&#xff0c;返回动态集合&#xff08;元素变化会实时更新&#xff09;。…...

Linux中《基础IO》详细介绍

目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改&#xff0c;实现简单cat命令 输出信息到显示器&#xff0c;你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...

快速排序算法改进:随机快排-荷兰国旗划分详解

随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...

命令行关闭Windows防火墙

命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)​方法二:CMD命令…...

Xcode 16 集成 cocoapods 报错

基于 Xcode 16 新建工程项目&#xff0c;集成 cocoapods 执行 pod init 报错 ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchro…...

用js实现常见排序算法

以下是几种常见排序算法的 JS实现&#xff0c;包括选择排序、冒泡排序、插入排序、快速排序和归并排序&#xff0c;以及每种算法的特点和复杂度分析 1. 选择排序&#xff08;Selection Sort&#xff09; 核心思想&#xff1a;每次从未排序部分选择最小元素&#xff0c;与未排…...

初级程序员入门指南

初级程序员入门指南 在数字化浪潮中&#xff0c;编程已然成为极具价值的技能。对于渴望踏入程序员行列的新手而言&#xff0c;明晰入门路径与必备知识是开启征程的关键。本文将为初级程序员提供全面的入门指引。 一、明确学习方向 &#xff08;一&#xff09;编程语言抉择 编…...