今日诗词:
醉后不知天在水,满船清梦压星河。
——《过洞庭》 [明] 唐珙
目录
补漏:
我们先来说两个昨天没提到的问题。
1.在C++中如果数组是满的,那么能添加元素吗?
如果数组是静态分配的(即其大小在编译时就已确定,如使用 int arr[10]; 声明的数组),并且它已经被“填满”(即所有元素都已经被赋予了值),那么你不能直接在这个数组中添加新的元素,因为它的大小是固定的。
然而,有几种方法可以处理这种情况:
使用更大的数组:如果你知道你需要存储的元素数量可能会超过当前数组的大小,你可以声明一个更大的数组。但这通常不是一种灵活或可扩展的解决方案。
使用动态内存分配:你可以使用 new 关键字(在C++中)来动态地分配一个足够大的数组,并在需要时重新分配它以容纳更多元素。但是,这种方法需要你手动管理内存,包括在适当的时候释放它。
使用 std::vector:这是处理动态数组的最简单、最安全的方法。std::vector 是一个模板类,它封装了动态数组的功能,并提供了自动的内存管理。你可以使用 push_back 成员函数来向 std::vector 添加新元素,而无需担心数组的大小。
下面是一个使用 std::vector 添加元素的示例:
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5}; // 初始化为包含5个元素的vector
// 向vector末尾添加一个元素
vec.push_back(6);
// 现在vec包含6个元素
for (int num : vec) {
std::cout << num << " ";
}
// 输出:1 2 3 4 5 6
return 0;
}
在这个例子中,std::vector 自动管理了内存,并在需要时增加了其容量以容纳新元素。你不需要担心数组的大小或内存管理的问题。
2.数组元素下标查找的升级版
在C++中,查找数组中元素的下标(索引)通常可以通过遍历数组来实现。下面是一个简单的示例,展示了如何在一个整型数组中查找一个给定元素的下标。如果元素不存在于数组中,则可以返回一个特定的值(如-1)来表示未找到。
#include <iostream>
using namespace std;
// 函数用于查找元素的下标
// arr: 数组名
// size: 数组的大小
// value: 要查找的值
// 返回值: 如果找到元素,则返回其下标;否则返回-1
int findElementIndex(int arr[], int size, int value) {
for (int i = 0; i < size; i++) {
if (arr[i] == value) {
return i; // 找到元素,返回其下标
}
}
return -1; // 未找到元素,返回-1
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
int size = sizeof(arr) / sizeof(arr[0]); // 计算数组大小
int valueToFind = 3;
int index = findElementIndex(arr, size, valueToFind);
if (index != -1) {
cout << "元素 " << valueToFind << " 的下标是 " << index << endl;
} else {
cout << "元素 " << valueToFind << " 未在数组中找到" << endl;
}
return 0;
}
这段代码首先定义了一个findElementIndex函数,它接受一个整型数组arr、数组的大小size和一个要查找的值value作为参数。函数通过遍历数组来查找指定的值,如果找到,则返回该值的下标;如果遍历完整个数组仍未找到,则返回-1。
在main函数中,我们定义了一个整型数组arr,并计算了数组的大小。然后,我们调用findElementIndex函数来查找值3的下标,并根据返回值打印相应的信息。
请注意,这种方法的时间复杂度是O(n),其中n是数组的大小。对于大型数据集或需要频繁查找的情况,可能需要考虑更高效的查找算法,如二分查找(前提是数组已排序)。
(2).二分查找法
二分查找法(Binary Search)是一种在有序数组中查找特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。
以下是二分查找法的一个基本实现,假设我们是在一个升序排列的数组中查找:
#include <iostream>
#include <vector>
using namespace std;
// 二分查找函数
// arr: 有序数组
// left: 查找范围的左边界
// right: 查找范围的右边界
// value: 要查找的值
// 返回值: 如果找到元素,则返回其下标;否则返回-1
int binarySearch(const vector<int>& arr, int left, int right, int value) {
while (left <= right) {
int mid = left + (right - left) / 2; // 防止溢出
if (arr[mid] == value) {
return mid; // 找到元素,返回其下标
} else if (arr[mid] < value) {
left = mid + 1; // 在右半部分查找
} else {
right = mid - 1; // 在左半部分查找
}
}
return -1; // 未找到元素,返回-1
}
int main() {
vector<int> arr = {1, 3, 5, 7, 9, 11};
int valueToFind = 7;
int index = binarySearch(arr, 0, arr.size() - 1, valueToFind);
if (index != -1) {
cout << "元素 " << valueToFind << " 的下标是 " << index << endl;
} else {
cout << "元素 " << valueToFind << " 未在数组中找到" << endl;
}
return 0;
}
在这个例子中,binarySearch函数接受一个有序数组arr、查找范围的左边界left、右边界right以及要查找的值value作为参数。函数内部通过一个while循环来不断缩小查找范围,直到找到元素或者查找范围为空。
注意,这里使用了vector<int>而不是普通的数组,因为vector提供了方便的size()方法来获取数组的大小,而且vector的边界检查更加安全。但是,二分查找同样适用于普通的数组,只是需要手动传递数组的大小作为参数。
另外,计算中间位置mid时使用了int mid = left + (right - left) / 2;而不是int mid = (left + right) / 2;,这是为了防止在left和right都很大时发生整数溢出。
现在我们来学习今天的内容:
二维数组
C++中的二维数组:
二维数组是一种数据结构,它在内存中连续存储多个一维数组。每个一维数组(也被称为行)包含固定数量的元素,而二维数组则包含固定数量的这些一维数组(行)。因此,二维数组可以看作是一个矩形的表格,其中每个位置都可以存储一个元素。
二维数组与一维数组的区别:
1.维度:一维数组仅有一个维度,用于存储线性序列的数据元素。而二维数组有两个维度,可以存储具有行和列结构的数据元素,如矩阵。
2.声明方式:一维数组的声明通常使用单个方括号来指定数组的大小,如int arr[5];。而二维数组的声明则使用两个方括号,第一个方括号指定行数,第二个方括号指定列数,如int matrix[3][4];。
3.内存布局:在内存中,一维数组的元素是连续存储的。二维数组同样如此,但它是按行存储的,即第一行的所有元素连续存储,紧接着是第二行的所有元素,依此类推。
4.访问元素:访问一维数组的元素时,只需使用一个索引。而访问二维数组的元素时,需要使用两个索引,第一个索引指定行,第二个索引指定列,如matrix[i][j]。
5.用途:一维数组通常用于存储简单的线性数据序列。二维数组则更适用于存储具有行列结构的数据,如图像、网格、表格和矩阵等。
通过这些区别,我们可以看出二维数组在C++中是一种非常有用的数据结构,它能够以直观的方式表示和操作二维空间中的数据。
实例:
二维数组:包含行列两个维度的数组。写的时候先写行的数列再写列的数列。
二维数组的访问:
看代码:
int a[2][4]={{1,2,3,4},{1,2,3,4}};
for(int i=0;i<4;++i)
{
for(int c=0;c<4;++c)
{
cout<<a[i][c];
}
cout<<endl;
}
用两个嵌套的循环来让二维数组输出。
之前在上一章讲到的关于数组的基本用法(增,删,查,该)在二维数组这,都是可行的。不过因为数组的维度上升而导致难度比之前大上不少。我们下期会对这部分进行补充。C++静态数组的用法
多维数组:
多维数组是指维度超过一维的数组,即二维或二维以上的数组。在多维数组中,数组的每个元素都可以是一个更低维度的数组,这种结构使得多维数组能够用来表示复杂的数据结构,如矩阵、立方体等。
一、多维数组的定义
一维数组:是最简单的数组,其元素通过单个索引进行访问。
二维数组:可以看作是一维数组的数组,即数组的每个元素都是一个一维数组。在二维数组中,元素通过两个索引进行访问,通常表示为行和列。
三维数组及更高维度:三维数组具有三个维度,可以看作是二维数组的数组,即数组的每个元素都是一个二维数组。在三维数组中,元素通过三个索引进行访问,这三个索引通常表示高、宽(或行、列)和深度(或层)。类似地,更高维度的数组也可以这样定义,每个维度都通过额外的索引进行访问。
二、多维数组的特点
1.结构复杂:多维数组的结构比一维数组复杂得多,能够表示更丰富的数据结构。
2.访问方式:多维数组的访问通常通过多个索引进行,这些索引分别对应数组的不同维度。
3.存储方式:在内存中,多维数组通常按照连续存储的方式进行存储,但不同维度的元素之间可能存在内存跳跃。
4.应用广泛:多维数组在计算机科学、数学、物理学、工程学等多个领域都有广泛的应用,特别是在需要处理矩阵、图像、视频等复杂数据结构的场景中。
三、多维数组的应用示例
1.矩阵运算:在数学和计算机科学中,矩阵是一种重要的数据结构,而二维数组正是表示矩阵的常用方式。通过二维数组,我们可以方便地进行矩阵的加法、乘法、转置等运算。
2.图像处理:在图像处理领域,图像通常被表示为一个二维数组(灰度图像)或三维数组(彩色图像,其中每个像素点包含红、绿、蓝三个颜色通道)。通过操作这些数组,我们可以实现图像的滤波、边缘检测、色彩调整等处理。
3.视频处理:视频可以看作是一系列连续的图像帧组成的,因此可以将视频表示为三维数组(时间、高度、宽度)或四维数组(时间、高度、宽度、颜色通道)。通过处理这些数组,我们可以实现视频的编码、解码、剪辑等操作。
四、多维数组的访问与遍历
在访问和遍历多维数组时,我们需要根据数组的维度和存储方式来确定访问和遍历的顺序。对于二维数组,通常按照行优先或列优先的顺序进行遍历;对于三维数组及更高维度的数组,则需要根据具体的应用场景来确定遍历的顺序。在访问多维数组的元素时,我们需要使用多个索引来指定元素的位置。
总之,多维数组是一种强大的数据结构,能够表示和处理复杂的数据结构。通过合理地使用多维数组,我们可以提高程序的效率和可维护性。
🆗到这里,这篇关于C++二维数组及多维数组的基础用法就说完了,求一个免费的赞,感谢阅读,我们下期见。