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++ 程式語言中最基本和最有用的功能之一。它們用於各種目的,例如排序和搜尋。我們希望您發現本教程很有幫助。

更新於: 2022年3月7日

2K+ 瀏覽量

啟動您的 職業生涯

透過完成課程獲得認證

開始
廣告

© . All rights reserved.