C++中的平行数组
平行数组也称为结构数组。
定义 − 平行数组可以定义为多个数组,其中第 i 个元素密切相关,并且它们共同构成一个实体。数组是 C++ 语言中的一个基本特性。创建平行数组有助于我们比较两个或多个数组。
例如,
first_name = ['John', 'Dexter', 'Fredd', 'Hank', 'james'] last_name = ['Jocab', 'Jonas', 'smith', 'lee', 'banner'] height = [160, 148, 231, 153, 162]
创建平行数组的方法
搜索和排序是形成平行数组所需的一些基本功能。
搜索
搜索基于实体的特定值。例如,我们需要找到身高小于 180 厘米的人的地址。因此,我们搜索身高数组中值小于 180 的条件。最后,当我们获得结果时,我们可以打印它们。
我们可以按照以下步骤执行搜索。
在相应的数组中搜索所需的值
存储获取值的索引。
打印值。
排序
排序时,我们对所有具有相同索引和值的数组进行排序。例如,我们需要按升序对高度索引进行排序。因此,当我们交换两个高度时,我们也会交换它们在其他数组中的值。我们可以以数字或字母方式对数组进行排序。
我们需要按照以下步骤对数组进行排序。
查找数组中的索引。
现在交换所有数组中两个计算出的索引的值。
实现
给定的代码存储姓名、第二个姓名和身高。
给定的代码存储姓名、第二个姓名和身高。
我们需要搜索第二高学生的姓名、第三矮的学生的姓名。
然后学生在记录中身高为 158 厘米。
示例
#include <iostream> using namespace std; int partition(string first_name[], string last_name[], int height[], int low, int high){ int pivot = height[high]; // pivot int i = (low - 1); // Index of smaller element for (int j = low; j <= high - 1; j++) { if (height[j] <= pivot) { i++; string temp = first_name[i]; first_name[i] = first_name[j]; first_name[j] = temp; temp = last_name[i]; last_name[i] = last_name[j]; last_name[j] = temp; int temp1 = height[i]; height[i] = height[j]; height[j] = temp1; } } string temp = first_name[i + 1]; first_name[i + 1] = first_name[high]; first_name[high] = temp; temp = last_name[i + 1]; last_name[i + 1] = last_name[high]; last_name[high] = temp; int temp1 = height[i + 1]; height[i + 1] = height[high]; height[high] = temp1; return (i + 1); } void quickSort(string first_name[], string last_name[], int height[], int low, int high){ if (low < high) { int pi = partition(first_name, last_name, height, low, high); quickSort(first_name, last_name, height, low, pi - 1); quickSort(first_name, last_name, height, pi + 1, high); } } void binarySearch(string first_name[], string last_name[], int height[], int value, int n){ int low = 0, high = n - 1; int index; while (low <= high) { index = (high + low) / 2; if (height[index] == 158) { cout << "Person having height 158" " cms is " << first_name[index] << " " << last_name[index] << endl; return; } else if (height[index] > 158) high = index - 1; else low = index + 1; } cout << "Sorry, no such person with" " height 158 cms"; cout << "is found in the record"; } void printParallelArray(string first_name[], string last_name[], int height[], int n){ cout << "Name of people in increasing"; cout << "order of their height: " << endl; for (int i = 0; i < n; i++) { cout << first_name[i] << " " << last_name[i] << " has height " << height[i] << " cms\n"; } cout << endl; } int main(){ int n = 4; string first_name[] = { "John", "Dexter", "Fredd", "Hank", "james"}; string last_name[] = { "Jocab", "Jonas", "smith", "lee", "banner"}; int height[] = {160, 148, 231, 153, 162}; quickSort(first_name, last_name, height, 0, n - 1); printParallelArray(first_name, last_name, height, n); cout << "Name of the second tallest person" " is " << first_name[n - 2] << " " << last_name[n - 2] << endl; cout << "Name of the third shortest person is " << first_name[2] << " " << last_name[2] << endl; binarySearch(first_name, last_name, height, 158, n); return 0; }
输出
Name of people in increasingorder of their height: Dexter Jonas has height 148 cms Hank lee has height 153 cms John Jocab has height 160 cms Fredd smith has height 231 cms Name of the second tallest person is John Jocab Name of the third shortest person is John Jocab Sorry, no such person with height 158 cmsis found in the record
平行数组的优点
在某些情况下,它们可以通过避免对齐问题来节省大量空间。例如,某些架构如果 4 字节整数始终存储在 4 的倍数的内存位置,则工作效果最佳。如果前一个字段是一个字节,它可能会丢弃 3 个字节。许多现代编译器可以自动避免此类问题。但是,在过去,一些程序员会明确地按对齐约束的递减顺序声明字段。
当数组中的项目数量较小时,数组索引比整个指针占用更少的空间,尤其是在某些架构上。
按顺序检查
按顺序检查数组中每个记录的单个字段在现代机器上速度很快,因为它相当于对单个数组进行线性遍历,具有理想的引用局部性和缓存行为。
平行数组的缺点
由于各种数组可以随机存储在相隔很远的地方,因此在尝试非顺序访问记录并检查每个记录的多个字段时,它们的引用局部性明显更差。
它们模糊了单个记录中字段之间的连接(例如,没有信息与它们之间的索引相关联,这可能会被误用)。
它们几乎没有直接的语言辅助(语言及其语法通常不表达平行数组中数组之间的关系,也无法捕获错误)。
由于收集字段不是“一件事情”,因此传递它既费时又容易出错。例如,函数必须将字段作为单独的参数接受,而不是调用函数来作用于单个记录(或结构或对象)。添加或更改新字段时,必须更改许多参数列表。相反,将对象整体传递可以完全避免此类更改。
扩展或收缩它们的成本很高,因为必须重新分配多个数组中的每一个。多级数组可以帮助解决此问题,但由于查找所需元素需要额外的间接寻址,因此会降低性能。
结论
在本教程中,我们学习了如何使用 c++ 代码创建平行数组。我们也可以用 java、python 和其他语言编写此代码。数组是 C++ 编程语言中最基本和最有用的功能之一。它们用于各种目的,例如排序和搜索。我们希望您发现本教程很有帮助。