C++指针(二)
个人主页:PingdiGuo_guo
收录专栏:C++干货专栏
前言
本篇是介绍数组指针与指针数组的概念,用处,操作以及练习的。点赞破五十,更新下一期。
文章目录
1.数组指针
1.1数组指针的概念
1.2数组指针的用处
1.3数组指针的操作
1.4二维数组如何访问
1.5数组指针访问流程
1.6数组指针的练习题
2.指针数组
2.1指针数组的概念
2.2指针数组的用处
2.3指针数组的操作
2.4指针二维数组
2.4指针数组的练习题
3.对比
总结
1.数组指针
在C++指针(一)中,我们知道指针是用来存放地址的,普通的指针只是用来存放一个变量的地址的,可想要存储一个数组的地址呢?接下来就要请出我们的新朋友:数组指针。
1.1数组指针的概念
数组指针是指向数组的指针。它指向数组的第一个元素的地址,通过递增指针的值可以访问数组中的其他元素。数组指针可以帮助程序员更灵活地操作数组,尤其是在需要传递数组作为参数或返回数组的函数中。
1.2数组指针的用处
数组指针有很多用途,以下是其中一些常见的用途:
1.遍历数组:通过指针运算,可以使用数组指针遍历整个数组,访问数组中的每个元素。
2.传递数组给函数:可以使用数组指针作为函数参数,将整个数组传递给函数。这样可以避免在函数中复制整个数组,提高程序的效率。
3.动态分配内存:可以使用数组指针来动态分配内存,创建动态数组。通过指针操作可以方便地访问和修改动态数组中的元素。
4.二维数组访问:对于二维数组,可以使用数组指针来访问和操作多维数组中的元素。
5.字符串操作:字符串在C语言中本质上是一个字符数组,可以使用数组指针来操作和处理字符串。
6.数组的排序和搜索:使用数组指针可以方便地对数组进行排序和搜索操作,以实现快速的查找和排序算法。
1.3数组指针的操作
数组指针存储一个数组的地址的步骤如下:
1. 首先,定义一个数组类型的指针变量。
int *ptr
2. 然后,将数组的首地址赋值给指针变量。有两种方法可以实现这一点:
a. 使用数组名来给指针变量赋值,因为数组名本身就是数组的首地址。具体代码如下所示:
int arr[6]={0,1,2,3,4,5};
ptr = arr;
b. 使用取地址运算符&来获取数组的首地址,并将其赋值给指针变量。具体代码如下所示:
int arr[6]={0,1,2,3,4,5};
ptr = &arr[0];
4.现在,指针变量ptr
就存储了数组arr
的首地址。我们可以通过该指针变量来访问数组中的元素。例如,可以使用*ptr
来访问第一个元素,*(ptr + 1)
来访问第二个元素,依此类推。当然,我们也可以用ptr[i]的形式来访问数组元素,这里,我们先学习比较常见的*(ptr+i)的方法。具体代码如下所示:
for (int i = 0; i < 6; i++) {cout << *(ptr + i) << " "; // 通过指针变量访问数组元素}
运行结果:
数组名为地址:
用取地址符:
5.数组数组的累加操作:首先定义一个整型数组arr,然后将数组的首地址赋值给指针ptr。接下来,使用一个循环和一个累加变量sum以及*(ptr + i)来累加数组中的元素。最后,输出结果。下面是一个示例代码:
int main() {int arr[] = {1, 2, 3, 4, 5};int* ptr = arr; // 将数组的首地址赋值给指针int sum = 0;for (int i = 0; i < 5; i++) {sum += *(ptr + i); // 使用指针加法操作来访问数组中的元素}cout << "Sum: " << sum << endl;return 0;
}
请注意,使用指针加法操作访问数组元素时,需要确保指针的有效性和数组的边界。不要越界访问数组元素,否则会导致未定义的行为。
6.数组指针插入操作:
1. 创建一个新的数组,长度比原数组大1;
2. 将要插入位置之前的元素复制到新数组中;
3. 插入新元素到指定位置;
4. 将原数组指定位置之后的元素复制到新数组中;
5. 释放原数组的内存;
6. 将新数组的地址赋值给原数组指针。
代码示例:
#include <iostream>int main() {int arr[5] = {1, 2, 3, 4, 5};int size = 5;int r = 2, p = 10;// 创建新的数组,长度比原数组大1int *newArr = new int[size + 1];// 将要插入位置之前的元素复制到新数组中for (int i = 0; i < r; i++) {newArr[i] = arr[i];}// 插入新元素到指定位置newArr[r] = p;// 将原数组指定位置之后的元素复制到新数组中for (int i = r; i < size; i++) {newArr[i + 1] = arr[i];}// 输出新数组std::cout << "新数组:";for (int i = 0; i < size + 1; i++) {std::cout << newArr[i] << " ";}std::cout << std::endl;// 释放原数组的内存delete[] arr;// 将新数组的地址赋值给原数组指针newArr = arr;std::cout<<"地址:"<<newArr<<std::endl;return 0;
}
在上述代码中,我们通过动态内存分配创建了一个新的数组,然后将原数组的元素复制到新数组中,并在指定位置插入新的元素。最后释放原数组的内存,将新数组的地址赋值给原数组指针。这样就实现了数组中元素的插入操作。
1.4二维数组如何访问
以下是使用数组指针访问二维数组的步骤和示例代码:
步骤:
1. 声明一个二维数组,并初始化。
2. 声明一个指向二维数组的指针变量。
3. 将指针变量指向二维数组的首地址。
4. 使用指针变量访问二维数组的元素。
示例代码:
#include <iostream>int main() {// 声明并初始化二维数组int matrix[3][3] = {{1, 2, 3},{4, 5, 6},{7, 8, 9}};// 声明指向二维数组的指针变量,并将其指向二维数组的首地址int (*ptr)[3] = matrix;// 使用指针变量访问二维数组的元素for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {std::cout << ptr[i][j] << " ";}std::cout << std::endl;}return 0;
}
运行结果:
1.5数组指针访问流程
数组指针访问的流程就是先指向指针头部,再遍历访问数组元素。如下:
其中,下标也可替换为数组元素。
1.6数组指针的练习题
题目:
给定一个整型数组arr和数组的长度size,编写一个函数将数组中的元素按照升序排列。
步骤:
1. 创建一个函数,命名为sortArray。函数参数包括一个整型数组指针arr和一个整型变量size。
2. 使用冒泡排序算法对数组进行排序。冒泡排序的原理是通过比较相邻的元素并交换位置来进行排序。
3. 在排序过程中,需要两层循环。外层循环控制排序的轮数,内层循环用来比较和交换元素。
4. 内层循环的条件是从0到size-1进行遍历,每次比较arr[j]和arr[j+1]的大小,如果arr[j]大于arr[j+1],则交换两个元素的位置。
5. 在外层循环结束后,数组的元素将按照升序排列。
6. 在main函数中创建一个整型数组并初始化,调用sortArray函数进行排序,然后输出排序后的数组。
知识点:
1. 数组指针
2. 冒泡排序算法
3. 循环控制结构
流程图式:
代码示例:
#include <iostream>void sortArray(int* arr, int size) {for (int i = 0; i < size - 1; i++) {for (int j = 0; j < size - i - 1; j++) {if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}int main() {int arr[] = {5, 3, 8, 2, 1};int size = sizeof(arr) / sizeof(arr[0]);std::cout << "排序前的数组:";for (int i = 0; i < size; i++) {std::cout << arr[i] << " ";}std::cout << std::endl;sortArray(arr, size);std::cout << "排序后的数组:";for (int i = 0; i < size; i++) {std::cout << arr[i] << " ";}std::cout << std::endl;return 0;
}
运行结果:
题目:
请编写一个程序,实现以下功能:
1. 创建一个包含10个整数的数组,并将其初始化为{1, 3, 5, 7, 9, 2, 4, 6, 8, 10};
2. 使用指针操作数组元素,找到数组中最大的元素,并输出其值和索引。
步骤:
1.创建一个包含10个整数的数组,并将其初始化为{1, 3, 5, 7, 9, 2, 4, 6, 8, 10}。
2.声明一个指针变量ptr,并将其指向数组的首地址,即第一个元素。
3.声明一个变量max,并将其初始化为数组的第一个元素。
4.声明一个变量index,并将其初始化为0。
5.使用for循环从数组的第二个元素开始遍历数组。
6.在循环中,使用指针算术运算访问数组元素,并将其与max进行比较。
7.如果当前元素大于max,则将max更新为当前元素,并将index更新为当前元素的索引。
8.循环结束后,max将存储数组中最大的元素,index将存储最大元素的索引。
9.输出max和index的值。
10.程序结束。
知识点:
数组指针,指针算术运算。
流程图式:
代码示例:
#include <iostream>int main() {int arr[10] = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10};int *ptr = arr; // 数组指针指向数组的第一个元素int max = *ptr; // 假设第一个元素为最大值int index = 0; // 最大值的索引// 使用指针遍历数组,找到最大值及其索引for (int i = 1; i < 10; i++) {if (*(ptr + i) > max) {max = *(ptr + i);index = i;}}// 输出最大值及其索引std::cout << "数组中最大的元素为:" << max << std::endl;std::cout << "其索引为:" << index << std::endl;return 0;
}
运行结果图:
2.指针数组
那有没有每一个元素都是指针的数组呢?当然也有啦,接下来要讲的指针数组就是。
2.1指针数组的概念
指针数组是指一个数组中的每个元素都是指针的数组。每个元素都指向不同的内存地址,可以在内存中找到实际的数据。
2.2指针数组的用处
指针数组有很多使用场景,以下是一些常见的用途:
1. 字符串数组:指针数组可以用来存储多个字符串,每个字符串都是一个指针,指向不同的字符串常量或字符数组。
2. 存储多个对象的引用:指针数组可以用来存储多个对象的指针,通过遍历指针数组可以操作这些对象,比如进行排序、搜索等操作。
3. 多级指针:指针数组还可以用来存储多个指针的指针,即多级指针。多级指针可以用于动态存储和访问多维数组、链表等数据结构。
4. 动态内存分配:指针数组可以用于动态分配内存,比如创建一个动态大小的数组。通过使用指针数组,可以根据需要动态调整数组的大小。
5. 函数参数传递:指针数组可以作为函数参数,传递给函数需要操作数组的指针。通过指针数组,可以在函数内部对数组进行修改,从而达到改变数组的目的。
总的来说,指针数组提供了一种便捷的方式来管理和操作多个相关的数据或对象,具有灵活性、高效性和方便性。
2.3指针数组的操作
1. 声明一个指针数组,代码如下:
// 创建指针数组并确定大小const int SIZE = 5;int* arr[SIZE];
SIZE是一个常量,用于记录指针数组arr的大小。
2. 初始化指针数组的元素:可以使用已存在的变量或者动态分配内存来创建新的变量。代码如下:
// 初始化指针数组的元素int num1 = 10;int num2 = 20;int num3 = 30;int* ptr1 = new int(40); // 使用动态内存分配创建新变量int* ptr2 = new int(50);arr[0] = &num1;arr[1] = &num2;arr[2] = &num3;arr[3] = ptr1;arr[4] = ptr2;
看到了么,指针数组是可以记录很多相同类型的变量的,也可以记录一个指针。
3. 访问指针数组的元素:即通过指针+循环的形式访问对应的变量或数据,这里就不需要向数组指针那样啦,直接用*arr[i]的形式即可。代码如下:
// 访问并输出指针数组的元素for (int i = 0; i < SIZE; i++) {std::cout << *arr[i] << " ";}std::cout << std::endl;
4.插入:声明一个新的指针来存储要插入的元素的地址。将要插入的元素赋值给新的指针。将所有后续元素往后移动一个位置,为要插入的元素腾出空间。在要插入的位置上将新的指针赋值给指针数组。
下面是一个示例代码,演示了如何在指针数组中插入元素:
#include <iostream>
using namespace std;int main() {int* arr[5] = { nullptr, nullptr, nullptr, nullptr, nullptr }; // 声明一个指针数组int value = 10; // 要插入的元素int* newValue = new int(value); // 在堆上分配内存空间,并将元素的地址赋值给新的指针int insertIndex = 2; // 要插入的位置// 将后续元素往后移动一个位置for (int i = 4; i > insertIndex; i--) {arr[i] = arr[i - 1];}// 将新的指针赋值给指针数组的插入位置arr[insertIndex] = newValue;// 输出指针数组的内容for (int i = 0; i < 5; i++) {if (arr[i] != nullptr) {cout << *arr[i] << " ";}else {cout << "null ";}}delete newValue; // 释放堆上分配的内存return 0;
}
注意,在使用完指针数组中的指针后,需要手动释放通过 `new` 运算符分配的内存空间,以避免内存泄漏。
5. 查找:查找指针数组中的特定元素,通过比较指针或变量的值来确定是否存在,我们可以用循环一个一个的查找。代码如下:
// 查找指针数组中的特定元素int* searchNum = &num2;bool found = false;for (int i = 0; i < SIZE; i++) {if (arr[i] == searchNum) {found = true;break;}}if (found) {std::cout << "Element found in the pointer array." << std::endl;} else {std::cout << "Element not found in the pointer array." << std::endl;}
注:这里可以把SIZE改为变量。
对了,最后不要忘记释放内存,代码如下:
// 释放动态内存delete ptr1;delete ptr2;
2.4指针二维数组
指针二维数组是一个具有指针类型元素的二维数组。可以使用指针二维数组来表示和操作多维的数据结构,如矩阵、图像等。下面是一个使用指针二维数组来表示矩阵,并进行一些操作的示例代码:
#include <iostream>
using namespace std;int main() {int rows = 3;int cols = 3;// 声明一个指针二维数组int** matrix = new int*[rows];for (int i = 0; i < rows; i++) {matrix[i] = new int[cols];}// 初始化矩阵for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {matrix[i][j] = i * cols + j + 1;}}// 输出矩阵for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {cout << matrix[i][j] << " ";}cout << endl;}// 释放内存for (int i = 0; i < rows; i++) {delete[] matrix[i];}delete[] matrix;return 0;
}
在这个示例中,我们首先声明了一个指针二维数组 matrix,它有3行3列。然后,使用 new 运算符为每一行分配内存空间。接下来,我们通过双重循环初始化矩阵的元素值。最后,通过双重循环输出矩阵的元素值。
在使用完指针二维数组后,记得释放为每一行分配的内存空间,并释放指针二维数组本身的内存空间,以避免内存泄漏。
运行结果:
2.4指针数组的练习题
题目:
假设有一个字符串数组,其中存储了一些人的姓名,请编写一个程序,将这些人的姓名按照字典序排序,并输出排序后的结果。
步骤:
1. 声明一个指针数组,用来存储人名的指针。
2. 声明一个整型变量 `n`,表示人名的数量,并根据实际情况进行赋值。
3. 使用动态内存分配为指针数组分配内存空间,使每个指针指向一个字符串。
4. 使用循环输入各个人名,并将每个人名的指针存储到指针数组中。
5. 使用冒泡排序对指针数组中的指针进行排序。
6. 使用循环输出排序后的人名。
7. 释放指针数组的内存空间。
知识点:
- 指针数组的声明和初始化
- 冒泡排序算法
- 动态内存分配和释放
流程图:
代码:
#include <iostream>
#include <cstring>
using namespace std;void bubbleSort(string* arr, int n) {for (int i = 0; i < n - 1; i++) {for (int j = 0; j < n - i - 1; j++) {if (arr[j] > arr[j + 1]) {swap(arr[j], arr[j + 1]);}}}
}int main() {int n;cout << "Enter the number of names: ";cin >> n;string* names = new string[n];for (int i = 0; i < n; i++) {cout << "Enter name " << i + 1 << ": ";cin >> names[i];}bubbleSort(names, n);cout << "Sorted names are: ";for (int i = 0; i < n; i++) {cout << names[i] << " ";}cout << endl;delete[] names;return 0;
}
在代码中,首先声明了指针数组 `names` 和整型变量 `n`,然后使用动态内存分配为指针数组分配内存空间。接下来,通过循环输入人名,并将每个人名的指针存储到指针数组中。然后,使用冒泡排序算法对指针数组进行排序。最后,通过循环输出排序后的人名,并释放指针数组的内存空间。
题目:
设计一个程序,要求从键盘输入10个学生的成绩,并使用指针数组对成绩进行排序并输出排序后的结果。
步骤:
1. 声明一个指针数组,用于存储学生成绩。
2. 通过循环,从键盘输入10个学生的成绩,将成绩存储到指针数组中。
3. 使用冒泡排序算法对指针数组中的成绩进行排序。
4. 输出排序后的学生成绩。
知识点:指针数组、冒泡排序算法、指针的比较和交换。
流程图:
代码:
#include <iostream>
using namespace std;void bubbleSort(int* arr[], int size) {for (int i = 0; i < size - 1; i++) {for (int j = 0; j < size - i - 1; j++) {if (*arr[j] > *arr[j + 1]) {int* temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}int main() {const int size = 10;int* scores[size];// 输入学生成绩for (int i = 0; i < size; i++) {int score;cout << "请输入第" << i + 1 << "个学生的成绩:";cin >> score;scores[i] = new int(score);}// 对成绩进行排序bubbleSort(scores, size);// 输出排序后的成绩cout << "排序后的成绩为:" << endl;for (int i = 0; i < size; i++) {cout << *scores[i] << " ";}cout << endl;// 释放内存for (int i = 0; i < size; i++) {delete scores[i];}return 0;
}
以上代码中,我们首先声明了一个指针数组 scores,用于存储学生成绩。然后通过循环,从键盘输入10个学生的成绩,并将成绩存储到指针数组中。接下来,使用冒泡排序算法对指针数组中的成绩进行排序。最后,输出排序后的学生成绩。在程序结束前,记得释放为每个学生成绩分配的内存空间,以避免内存泄漏。
3.对比
指针数组和数组指针是两个不同的概念,有以下区别:
1. 定义方式不同:
- 指针数组:指针数组是指一个数组,其中的每个元素都是一个指针。定义时需要指定数组的大小,例如 `int* arr[size]`,表示一个大小为 `size` 的指针数组。
- 数组指针:数组指针是指一个指针,它指向一个数组。定义时需要指定指针所指向数组的类型,例如 `int (*ptr)[size]`,表示一个指向大小为 `size` 的整型数组的指针。
2. 访问方式不同:
- 指针数组:可以通过索引来访问指针数组中的元素,例如 `arr[i]`。
- 数组指针:可以通过解引用指针来访问数组中的元素,例如 `(*ptr)[i]`。
3. 内存分配不同:
- 指针数组:指针数组中的每个元素都可以单独分配内存,可以具有不同的大小和类型。
- 数组指针:数组指针指向的数组是连续存储的,内存是一次性分配的。
4. 数组维度不同:
- 指针数组:指针数组的每个元素都可以指向不同大小的数组,维度可以是不同的。
- 数组指针:数组指针指向的数组有固定的大小和维度,指针只能指向该大小和维度的数组。
需要注意的是,指针数组和数组指针可以结合使用,例如可以定义一个数组指针,使其指向一个指针数组。这样既可以通过指针来访问数组的元素,也可以通过数组的索引来访问指针数组的元素。
总结
本篇博客到这里就结束了,感谢大家的支持与观看,如果有好的建议欢迎留言,谢谢大家啦!
相关文章:
C++指针(二)
个人主页:PingdiGuo_guo 收录专栏:C干货专栏 前言 本篇是介绍数组指针与指针数组的概念,用处,操作以及练习的。点赞破五十,更新下一期。 文章目录 1.数组指针 1.1数组指针的概念 1.2数组指针的用处 1.3数组指针的操…...
C++有关内存的那些事
个人主页:PingdiGuo_guo 收录转栏:C干货专栏 前言 本篇博客是讲解关于C内存的一些知识点的。 文章目录 前言 1.内存函数 1.1memcpy函数 1.2memmove函数 1.3 memset函数 2.各数据类型占用 2.1bool类型 2.2char类型 2.3short、int、long类型及整数…...
4.11时钟延迟
时钟偏差:同一个时钟域内的时钟信号到达数字电路的各个部分(寄存器)所用的时间差异 信号达到目标寄存器与接收寄存器的时间差【一般默认信号经过电路时间不计,】 图源:优化时钟网络之时钟偏移-CSDN博客 时钟周期是计…...
下列软件包有未满足的依赖关系: python3-catkin-pkg : 冲突: catkin 但是 0.8.10-
下列软件包有未满足的依赖关系: python3-catkin-pkg : 冲突: catkin 但是 0.8.10- 解决: 1. 确认当前的包状态 首先,运行以下命令来查看当前安装的catkin和python3-catkin-pkg版本,以及它们之间的依赖关系: dpkg -l | grep ca…...
ANSI C 和 C89/C90
在嵌入式开发中提到的 ANSI 通常是指 ANSI C 标准,而 C89 是该标准的另一个名称。以下是详细的解释和两者的关系: 1. ANSI C 是什么? ANSI(American National Standards Institute,美国国家标准协会)在 19…...
git仓库中.git文件夹过大的问题
由于git仓库中存放了较大的文件,之后即使在gitignore中添加,也不会导致.git文件夹变小。 参考1 2 通过 du -d 1 -h查看文件大小 使用 git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail…...
【android bluetooth 框架分析 01】【关键线程 6】【主线程与核心子线程协作机制】
主线程与核心子线程的协作机制 一、蓝牙进程中的线程架构全景图 在Android蓝牙协议栈中,线程分工非常明确,形成了一个高效的协作体系。我们可以将其想象成一个医院的组织架构: 主线程:相当于医院的"前台接待处"&#…...
蓝桥杯比赛 python程序设计——神奇闹钟
问题描述 小蓝发现了一个神奇的闹钟,从纪元时间(19701970 年 11 月 11 日 00:00:0000:00:00)开始,每经过 xx 分钟,这个闹钟便会触发一次闹铃 (纪元时间也会响铃)。这引起…...
旋转位置编码
旋转位置编码(Rotary Position Embedding,RoPE): 一种能够将相对位置信息依赖集成到 self-attention 中并提升 transformer 架构性能的位置编码方式。 和相对位置编码相比,RoPE 具有更好的外推性,目前是大模型相对位…...
2025年第十八届“认证杯”数学中国数学建模网络挑战赛【B题】完整版+代码+结果
2025年第十八届“认证杯”数学中国数学建模网络挑战赛B题完整word论文代码结果https://download.csdn.net/download/qq_52590045/90592749↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓…...
管理、切换多个 hosts工具之SwitchHosts
管理、切换多个 hosts工具之SwitchHosts 官网:https://switchhosts.vercel.app/zh github: https://github.com/oldj/SwitchHosts 原作者博客:https://oldj.net/article/2015/12/20/switchhosts-v3/ SwitchHosts是一个用于管理hosts文件的应用程序&…...
【Reinforcement Learning For Quadruped Control】2
奖励函数。奖励函数是状态和动作的函数 r t ( s t , a t , s t 1 ) r_t(s_t, a_t, s_{t1}) rt(st,at,st1),是强化学习(RL)算法的驱动力。在四足机器人等复杂系统的背景下,奖励可能是速度偏差与期望速度的差异、关节扭矩值…...
Windows启动总是卡在LOGO画面有哪些原因
1. 硬件问题 硬盘故障(HDD/SSD):坏道、损坏或接口松动。 内存故障:内存条接触不良或损坏。 外设冲突:U盘、移动硬盘、打印机等外接设备导致系统无法正常启动。 2. 系统文件损坏 Windows 关键文件丢失或损坏&#x…...
4月11日随笔
本来以为大风会很厉害,本来今天早八的微积分不想去了。但是起床发现并没有很大的风,还是去了。 中午回来的路上突然变天,雷阵雨转冰雹。下了大概半小时,所幸挨淋的不是很严重。 中午打了首胜,AI的基本弄完了…...
蓝桥杯 — — 接龙数列
蓝桥杯 — — 接龙数列 接龙数列 题源:0接龙数列 - 蓝桥云课 题目: 输入样例: 5 11 121 22 12 2023输出样例: 1分析: 首先观察评测用例规模, N N N 最大为 1 0 5 10^5 105,因此时间复杂度应…...
链式多分支规则树模型的应用
目录 引入 开始调用 初始化 执行流程 欢迎关注我的博客!26届java选手,一起加油💘💦👨🎓😄😂 引入 最近在学习一个项目中的链式多分枝规则树模型的使用,模型如下&#…...
【后端开发】初识Spring IoC与SpringDI、图书管理系统
文章目录 图书管理系统用户登录需求分析接口定义前端页面代码服务器代码 图书列表展示需求分析接口定义前端页面部分代码服务器代码Controller层service层Dao层modle层 Spring IoC定义传统程序开发解决方案IoC优势 Spring DIIoC &DI使用主要注解 Spring IoC详解bean的存储五…...
VMware虚拟机Ubuntu磁盘扩容
VMware中操作: 选择要扩容的虚拟机,点击编辑虚拟机设置 打开后点击磁盘——>点击扩展(注意:如果想要扩容的话需要删除快照) 调整到你想要的容量 点击上图的扩展——>确定 然后我们进到虚拟机里面 首先&#…...
嵌入式MCU常用模块
日后填坑。 无线通信模块 NRF24L01 基本介绍 使用方法 示例代码 蓝牙模块 基本介绍 使用方法 示例代码 WIFI模块 基本介绍 使用方法 示例代码 红外遥控模块 基本介绍 使用方法 示例代码 有线通信模块 can模块 基本介绍 使用方法 示例代码 传感器模块 DHT11模块 基本介绍 使用方…...
算法 模版
cin cout加快读取速度: ios::sync_with_stdio(false); 高精度*高精度 vector<int> mul(vector<int>& a, vector<int>& b) {vector<int>c(b.size()a.size()5,0);for (int i 0; i < a.size(); i) {for (int j 0; j < b.si…...
C++指针(三)
个人主页:PingdiGuo_guo 收录专栏:C干货专栏 文章目录 前言 1.字符指针 1.1字符指针的概念 1.2字符指针的用处 1.3字符指针的操作 1.3.1定义 1.3.2初始化 1.4字符指针使用注意事项 2.数组参数,指针参数 2.1数组参数 2.1.1数组参数的概念 2.1…...
二分查找4:35. 搜索插入位置
链接:35. 搜索插入位置 - 力扣(LeetCode) 题解: 本题是最基础的二分查找算法 class Solution { public:int searchInsert(vector<int>& nums, int target) {int left0;int rightnums.size()-1;int midleft(right-lef…...
数据可视化 —— 多边图应用(大全)
一、介绍: 多边形图,也就是在数据可视化中使用多边形来呈现数据的图表,在多个领域都有广泛的应用场景,以下为你详细介绍: 金融领域 投资组合分析:在投资组合管理中,多边形图可用于展示不同资…...
服务器加空间失败 growpart /dev/vda 1
[rootecm-2c5 ~]# growpart /dev/vda 1 unexpected output in sfdisk --version [sfdisk,来自 util-linux 2.23.2] [rootecm-2c5 ~]# xfs_info /dev/vda1 meta-data/dev/vda1 isize512 agcount21, agsize1310656 blks sectsz512 attr2, projid32bit1 crc1 finobt0…...
tree-sitter的grammar.js解惑
❓问题1:grammar.js 不是用正则表达式 /.../ 吗?为什么有 print 这样的字符串? ✅ 回答: grammar.js 分成两类“终结符”表示法: 表达方式含义xxx直接匹配该字符串字面量/regex/匹配符合正则的文本 💡 …...
前端-Vue3
1. Vue3简介 2020年9月18日,Vue.js发布版3.0版本,代号:One Piece(n 经历了:4800次提交、40个RFC、600次PR、300贡献者 官方发版地址:Release v3.0.0 One Piece vuejs/core 截止2023年10月,最…...
【毕设通关】——文献查阅
目录 🕒 1. 常见文献库🕒 2. 快速寻找文献🕒 3. 引用网页资料 🕒 1. 常见文献库 中文文献: CNKI中国知网万方数据维普资讯超星期刊 英文文献: 谷歌学术Sci-hubOALib(Open Access Library&am…...
贪心算法-跳跃游戏
55.跳跃游戏 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。输入…...
程序化广告行业(75/89):行业发展与PC端和移动端投放差异
程序化广告行业(75/89):行业发展与PC端和移动端投放差异 在互联网广告领域,程序化广告正发挥着越来越重要的作用。今天,咱们就来一起深入了解一下程序化广告行业,希望能和大家一起学习进步,共同…...
Windows 下搭建 Git 本地服务器并进行开发
目录 1. 安装 Git for Windows 2. 创建本地 Git 仓库(裸仓库) 3. 设置本地开发环境 (1) 在开发机器上克隆仓库 (2) 提交代码 4. 远程访问本地 Git 服务器 方法 1:使用 SSH 访问 (1) 配置 SSH 服务器 (2) 客户端连接 方法 2…...
C++中stack函数的用法示例
C++中stack函数的用法示例 std::stack 是C++标准模板库(STL)中的一个容器适配器,它提供了后进先出(LIFO)的数据结构。以下是stack的一些常用函数及其用法示例: 1. 基本操作 #include <iostream> #include <stack>int main() {// 创建一个整数栈std::stack<…...
网络安全1
一、网络安全的定义与重要性 定义 网络安全(信息技术安全):保护计算机系统和网络免受电子攻击的技术和过程,包括保护个人信息和企业数据不被盗窃、破坏或非法访问。涵盖范围:网络设备、数据传输、系统运行安全。 重要…...
腾讯会议for flatpak
今天想切换opensuse,无意间查询了腾讯会议等软件的下载方式,发现腾讯会议是deb包安装的。但是过程中,我发现flatpak仓库中居然有腾讯会议,然后尝试着在wayland下的debian12中进行了安装。 发现居然可以正常开启视频等操作。 下载…...
【C++初学】C++核心编程技术详解(二):类与继承
函数提高 3.1 函数默认参数 函数的形参可以有默认值,调用时可以省略这些参数。 示例代码: int func(int a, int b 10, int c 10) {return a b c; }int main() {cout << "ret " << func(20, 20) << endl;cout <<…...
紧急任务插入,如何不影响原计划
面对紧急任务插入,为确保不影响原计划,需要做到:重新明确任务优先级、合理调整资源配置、灵活管理时间和任务、建立紧急任务处理流程、有效沟通与反馈。其中,重新明确任务优先级最为关键。这可以帮助项目团队快速确定哪些任务需立…...
蓝桥杯赛前题
开始每个人能量为3 答题了,答题者1 扣分最后算 #include<bits/stdc.h> using namespace std;const int N1e510; int a[N]; int main(){int n,k,q;cin>>n>>k>>q;for(int i1;i<n;i){a[i]k; }for(int i1;i<q;i){int x;cin>>x;a[…...
ETL的核心概念与价值
在数字化转型的浪潮中,数据已成为企业决策的基石。然而,面对分散、异构且质量参差不齐的数据源,如何高效整合并挖掘其价值?这一问题的答案,指向了一项关键的技术——ETL(Extract-Transform-Load)…...
神经动力学系统与计算及AI拓展
大脑,一个蕴藏在我们颅骨之内的宇宙,以活动脉动,如同由电信号和化学信号编织而成的交响乐,精巧地协调着思想、情感和行为。但是,这种复杂的神经元舞蹈是如何产生我们丰富多彩的精神生活的呢?这正是神经动力…...
力扣DAY46-50 | 热100 | 二叉树:展开为链表、pre+inorder构建、路径总和、最近公共祖先、最大路径和
前言 中等 、困难 √,越来越有手感了,二叉树done! 二叉树展开为链表 我的题解 前序遍历树,当遇到左子树为空时,栈里pop节点,取右子树接到左子树位置,同时断开该右子树与父节点的连接&#x…...
备赛蓝桥杯-Python-考前突击
额,,离蓝桥杯开赛还有十个小时,最近因为考研复习节奏的问题,把蓝桥杯的优先级后置了,突然才想起来还有一个蓝桥杯呢。。 到目前为止python基本语法熟练了,再补充一些常用函数供明天考前再背背,算…...
蓝桥杯 Web 方向入门指南:从基础到实战
一、蓝桥杯 Web 方向简介 蓝桥杯是国内最具影响力的编程竞赛之一,Web 方向主要考察前端开发和后端服务能力。比赛形式为 4 小时限时编程,题型包括页面布局、数据交互、API 开发等。根据最新大纲,大学组需掌握 HTML5、CSS3、JavaScript、Vue.…...
生命篇---心肺复苏、AED除颤仪使用、海姆立克急救法、常见情况急救简介
生命篇—心肺复苏、AED除颤仪使用、海姆立克急救法、常见情况急救简介 文章目录 生命篇---心肺复苏、AED除颤仪使用、海姆立克急救法、常见情况急救简介一、前言二、急救1、心肺复苏(CPR)(1)适用情况(2)操作…...
C++Cherno 学习笔记day19 [76]-[80] std::optional、variant、any
b站Cherno的课[76]-[80] 一、如何处理OPTIONAL数据 std::optional二、单一变量存放多类型的数据 std::variant三、如何存储任意类型的数据 std::any四、如何让C运行得更快五、如何让C字符串更快 一、如何处理OPTIONAL数据 std::optional std::optional C17 数据是否存在是可选…...
【Python Requests 库详解】
目录 简介一、安装与导入安装导入 二、发送 HTTP 请求1. GET 请求基本请求URL 参数 2. POST 请求表单数据提交JSON 数据提交文件上传 3. 其他方法PUT 请求示例DELETE 请求示例 三、处理响应1. 响应内容解析文本内容处理二进制内容处理JSON 数据处理 2. 响应状态与头信息状态码检…...
二维偏序-蓝桥20102,没写完
代码: 暴力:只过了35%,双重for循环o(n^2)1e10; #include <iostream> #include <bits/stdc.h> using namespace std; const int N1e910; typedef long long LL; typedef pair<int,int> PII;int main() {// 请在此输入您的代码//相当于…...
ASEG的鉴定
等位基因特异性表达(Allele-Specific Expression, ASE)基因的鉴定是研究杂种优势和基因表达调控的重要手段。以下是鉴定ASE基因的详细流程和方法: ### **1. 实验设计与样本准备** - **选择材料**:选择杂交种及其亲本作为研究材料。例如,玉米中的B73和Mo17及其杂交组合B73…...
从零开始:在 GrapesJS Style Manager 中新增 row-gap 和 column-gap
在前端开发中,页面样式的灵活性和可扩展性至关重要。GrapesJS 作为一个强大的网页构建工具,其内置的 Style Manager 提供了常见的 CSS 样式的可视化设置,极大地方便了开发者和设计师。然而,随着项目需求的不断变化,有些…...
解决双系统ubuntu24.04开机出现花屏等情况
1. 问题描述: 刚刚装上的双系统ubuntu24.04开机就出现花屏情况 2. 解决方案 安装显卡驱动 查看显卡型号 查看显卡硬件支持的驱动类型 ubuntu-drivers devices如果输入没有反映,请更新软件源,或者换官方软件源 sudo add-apt-repository…...
基于SpringBoot的智慧社区管理系统(源码+数据库)
499基于SpringBoot的智慧社区管理系统,系统包含三种角色:管理员、用户主要功能如下。 【用户功能】 1. 首页:查看系统。 2. 超市商品:浏览超市中各类商品信息。 3. 动物信息:了解社区内的动物种类和相关信息。 4. 车位…...
通俗理解CLIP模型如何实现图搜图乃至文搜图
一、图搜图与文搜图 图搜图和文搜图的场景相信大家并不少见,比如度娘的搜索框就可以直接上传图片找到相似的图片,还有某宝某团都有这种上传图片匹配到相似商品或者商品页的推荐的功能。那比如我想搜一张“正在跳舞的狗”的图片,是不是就能搜…...