C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++の並列配列


並列配列は構造体配列とも呼ばれます。

定義 −並列配列は、i番目の要素が密接に関連し、一緒になってエンティティを構成する複数の配列として定義できます。配列は、C++言語の基本的な機能です。並列配列を作成すると、2つ以上の配列を比較するのに役立ちます。

たとえば、

first_name = ['John', 'Dexter', 'Fredd', 'Hank', 'james']
last_name = ['Jocab', 'Jonas', 'smith', 'lee', 'banner']
height = [160, 148, 231, 153, 162]

並列アレイを作成するためのアプローチ

検索と並べ替えは、並列配列を形成するために必要な重要な機能の一部です。

検索

検索は、エンティティの特定の値に基づいています。たとえば、身長が180cm未満の人の住所を見つける必要があります。そこで、180未満の値を持つ高さ配列の条件を検索します。最後に、結果が得られたら、それらを出力できます。

次の手順に従って検索を実行できます。

  • それぞれの配列で必要な値を検索します

  • 値が取得されるインデックスを保存します。

  • 値を印刷します。

並べ替え

並べ替えでは、同じインデックスと値を持つすべての配列を並べ替えます。たとえば、高さインデックスを昇順で並べ替える必要があります。したがって、2つの高さを交換すると、他の配列の値も交換されます。配列は数値またはアルファベット順に並べ替えることができます。

配列を並べ替えるには、次の手順に従う必要があります。

  • 配列内のインデックスを見つけます。

  • 次に、すべての配列の2つの計算されたインデックスの値を交換します。

実装

  • 指定されたコードには、名前、ミドルネーム、身長が格納されています。

  • 指定されたコードには、名前、ミドルネーム、身長が格納されています。

  • 2番目に背の高い生徒、3番目に背の低い生徒の名前を検索する必要があります。

その場合、生徒の身長はレコードで158cmになります。

#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の倍数であるメモリ位置に格納されている場合に最適に機能します。前のフィールドが1バイトの場合、3バイトが破棄される可能性があります。最近のコンパイラの多くは、このような問題を自動的に回避できます。それでも、過去には、一部のプログラマーは、アライメント制約の降順でフィールドを明示的に宣言していました。

  • 配列内のアイテムの数が少ない場合、特に一部のアーキテクチャでは、配列インデックスがポインタ全体よりもはるかに少ないスペースを占める可能性があります。

  • 順番に調べた

  • 配列内の各レコードの単一のフィールドを順番に調べることは、参照とキャッシュの動作の理想的な局所性を備えた単一の配列の線形トラバーサルに相当するため、最新のマシンでは高速です。

並列アレイのデメリット

  • さまざまな配列をランダムに離れた場所に格納できるため、レコードに連続してアクセスしようとしたり、各レコードの複数のフィールドを調べたりすると、参照の局所性が大幅に低下します。

  • それらは、単一のレコード内のフィールド間の接続をあいまいにします(たとえば、フィールド間のインデックスに関連する情報がないため、誤用される可能性があります)。

  • 言語による直接的な支援はほとんどありません(言語とその構文は通常、並列配列内の配列間の関係を表さず、エラーをキャッチできません)。

  • フィールドの収集は「もの」ではないため、フィールドを渡すのは時間がかかり、エラーが発生しやすくなります。たとえば、関数は、単一のレコード(または構造体やオブジェクト)に作用する関数を呼び出すのではなく、フィールドを個別の引数として受け入れる必要があります。多くのパラメータリストは、新しいフィールドが追加または変更されたときに変更する必要があります。対照的に、オブジェクト全体を渡すと、そのような変更は完全に回避されます。

  • 複数のアレイのそれぞれを再割り当てする必要があるため、拡張または縮小するにはコストがかかります。マルチレベル配列はこの問題に役立ちますが、目的の要素を見つけるために必要な追加の間接参照のためにパフォーマンスが低下します。

結論

このチュートリアルでは、c++コードとともに並列配列を作成する方法を学びました。このコードは、Java、Python、およびその他の言語で作成することもできます。配列は、C++プログラミング言語の基本的で最も役立つ機能の1つです。並べ替えや検索など、さまざまな目的で使用されます。このチュートリアルがお役に立てば幸いです。


  1. 並列配列を実装するC++プログラム

    並列配列は、複数の配列を含む構造体です。これらの配列はそれぞれ同じサイズであり、配列要素は相互に関連しています。並列配列のすべての要素は、共通のエンティティを表します。 並列配列の例は次のとおりです- employee_name = { Harry, Sally, Mark, Frank, Judy } employee_salary = {10000, 5000, 20000, 12000, 5000} 上記の例では、5人の異なる従業員の名前と給与が2つの配列に格納されています。 並列配列を示すプログラムは次のとおりです- 例 #include <iostream> #in

  2. 配列をC++関数に渡す

    C ++では、配列全体を引数として関数に渡すことはできません。ただし、インデックスなしで配列の名前を指定することにより、配列へのポインタを渡すことができます。 1次元配列を関数の引数として渡したい場合は、次の3つの方法のいずれかで関数の仮パラメーターを宣言する必要があります。3つの宣言メソッドはすべて、整数ポインターが実行されることをコンパイラーに通知するため、同様の結果を生成します。受け取る必要があります。 配列を関数に渡す方法は3つあります- ポインタとしての正式なパラメータ void myFunction(int *param) {    // Do so