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

C++における配列型の操作方法を徹底解説

配列(array)とは、C++におけるデータ構造の一つで、同じデータ型の複数の要素を連続したメモリ領域に格納するものです。

C++プログラミング言語には、配列型を操作するための組み込み関数が用意されており、その一部は多次元配列にも適用できます。これらの関数は、<type_traits>ヘッダーファイルに含まれています。

本記事では、C++で配列を操作するための主要なメソッドを、実際のコード例とともに詳しく解説していきます。

is_array() ― 配列かどうかを判定する

is_array()は、関数に渡された変数が配列型かどうかをチェックするための関数です。このメソッドは配列の判定に厳格で、std::arrayであっても配列とは認められず、falseを返します。戻り値はブール値であり、配列が渡された場合はtrue(1)、それ以外の場合はfalse(0)を返します。

コード例

#include<type_traits>
#include<iostream>
#include<array>
#include<string>
using namespace std;
int main(){
   cout<<"Checking if int is an array ? : ";
   is_array<int>::value?cout<<"True":cout<<"False";
   cout<<"\nChecking if int[] is an array? : ";
   is_array<int[6]>::value?cout<<"True":cout<<"False";
   cout<<"\nChecking if 2D Array is an array? : ";
   is_array<int[2][3]>::value?cout<<"True":cout<<"False";
   cout<<"\nChecking if String is an array? : ";
   is_array<string>::value?cout<<"True":cout<<"False";
   cout<<"\nChecking if Character Array is an array? : ";
   is_array<char[4]>::value?cout<<"True":cout<<"False";
   cout << endl;
   return 0;
}

実行結果

Checking if int is an array ? : False
Checking if int[] is an array? : True
Checking if 2D Array is an array? : True
Checking if String is an array? : False
Checking if Character Array is an array? : True

この結果から、intstringのような単一の型はfalseとなり、int[6]int[2][3]のような配列型はtrueと判定されていることがわかります。

is_same() ― 2つの型が同一かどうかを判定する

is_same()は、渡された2つの型が完全に同じ設計(型定義)を持っているかどうか、つまり両方の型が同一であるかをチェックする関数です。以下の例で、その概念を確認してみましょう。

コード例

#include<type_traits>
#include<iostream>
#include<array>
#include<string>
using namespace std;
int main(){
   cout << "Checking if 1D array is same as 1D array (Different sizes) ? : " ;
   is_same<int[3],int[4]>::value?cout<<"True":cout<<"False";
   cout << "\nChecking if 1D array is same as 1D array? (Same sizes): " ;
   is_same<int[5],int[5]>::value?cout<<"True":cout<<"False";
   cout << "\nChecking If 2D array is same as 1D array? : ";
   is_same<int[3],int[3][4]>::value?cout<<"True":cout<<"False";
   cout << "\nChecking if Character array is same as Integer array? : " ;
   is_same<int[5],char[5]>::value?cout<<"True":cout<<"False";
   return 0;
}

実行結果

Checking if 1D array is same as 1D array (Different sizes) ? : False
Checking if 1D array is same as 1D array? (Same sizes): True
Checking If 2D array is same as 1D array? : False
Checking if Character array is same as Integer array? : False

注目すべき点として、要素数が異なるint[3]int[4]は別の型として扱われ、falseが返されます。配列型においては、要素数も型の一部であることを理解しておきましょう。

rank() ― 配列の次元数を取得する

rank関数は、渡された配列のランク(次元数)を返します。戻り値は配列のランクを表す整数値です。

コード例

#include<type_traits>
#include<iostream>
using namespace std;
int main(){
   cout<<"Print rank for the following types of arrays : \n";
   cout<<"integer : "<<rank<int>::value<<endl;
   cout<<"1D integer array (int[]) : "<< rank<int[5]>::value<<endl;
   cout<<"2D integer array (int[][]) : "<<rank<int[2][2]>::value<<endl;
   cout<<"3D integer array (int[][][]) : "<<rank<int[2][3][4]>::value<<endl;
   cout<<"1D character array : "<<rank<char[10]>::value<<endl;
}

実行結果

Print rank for the following types of arrays :
integer : 0
1D integer array (int[]) : 1
2D integer array (int[][]) : 2
3D integer array (int[][][]) : 3
1D character array : 1

配列ではないintのような単純な型はランク0となり、1次元配列は1、2次元配列は2というように、次元数に応じた値が返されます。

extent() ― 特定の次元のサイズを取得する

C++のextent()メソッドは、配列の指定した次元のサイズを返します。このメソッドには「配列型」と「次元」の2つの入力パラメータを指定します。

コード例

#include<type_traits>
#include<iostream>
using namespace std;
int main(){
   cout<<"Printing the length of all dimensions of the array arr[2][45][5] :\n";
   cout<<"1st dimension : "<<extent<int[2][45][5],0>::value<<endl;
   cout<<"2nd dimension : "<<extent<int[2][45][5],1>::value<<endl;
   cout<<"3rd dimension : "<<extent<int[2][45][5],2>::value<<endl;
   cout<<"4th dimension : "<<extent<int[2][45][5],3>::value<<endl;
}

実行結果

Printing the length of all dimensions of the array arr[2][45][5] :
1st dimension : 2
2nd dimension : 45
3rd dimension : 5
4th dimension : 0

存在しない次元(この例では4次元目)を指定した場合、0が返される点に注意してください。

remove_extent() ― 配列の次元を1つ削除する

remove_extent関数は、多次元配列から次元を取り除くために使用されます。具体的には、配列の最初の次元を削除します。

コード例

#include<type_traits>
#include<iostream>
using namespace std;
int main(){
   cout<<"Removing extent of the array arr[2][5][4] : \n";
   cout<<"Initial rank : "<<rank<int[2][5][4]>::value<<endl;
   cout<<"The rank after removing 1 extent is : " ;
   cout << rank<remove_extent<int[20][10][30]>::type>::value << endl;
   cout << "length of 1st dimension after removal is :";
   cout<<extent<remove_extent<int[20][10][30]>::type>::value << endl;
}

実行結果

Removing extent of the array arr[2][5][4] :
Initial rank : 3
The rank after removing 1 extent is : 2
length of 1st dimension after removal is :10

この例では、3次元配列int[20][10][30]から最初の次元が削除され、ランクが3から2に変化しています。削除後の最初の次元の長さは、元の2番目の次元である10になっています。

remove_all_extents() ― 配列のすべての次元を削除する

remove_all_extents()関数は、配列のすべての次元を一度に取り除くために使用されます。これにより、配列はその要素型と同じ型の通常の変数へと変換されます。

コード例

#include<type_traits>
#include<iostream>
using namespace std;
int main(){
   cout<<"Removing all extents of the array arr[2][5][4] : \n";
   cout<<"Initial rank : "<<rank<int[2][5][4]>::value<<endl;
   cout<<"The rank after removing all extents is : " ;
   cout << rank<remove_all_extents<int[20][10][30]>::type>::value << endl;
   cout << "length of 1st dimension after removal is :";
   cout<<extent<remove_all_extents<int[20][10][30]>::type>::value << endl;
}

実行結果

Removing all extents of the array arr[2][5][4] :
Initial rank : 3
The rank after removing all extents is : 0
length of 1st dimension after removal is :0

すべての次元が削除された結果、ランクは0になり、配列ではなく単一のint型として扱われます。

まとめ

C++の<type_traits>ヘッダーが提供する配列操作関数を活用することで、コンパイル時に配列の型情報を柔軟に取得・変換できます。

  • is_array():配列型かどうかを判定
  • is_same():2つの型が同一かどうかを判定
  • rank():配列の次元数を取得
  • extent():指定した次元のサイズを取得
  • remove_extent():最初の次元を削除
  • remove_all_extents():すべての次元を削除

これらの機能は、テンプレートメタプログラミングやジェネリックコードの作成において特に有用です。ぜひ実際のコードで試してみてください。

  1. C++で配列を並べ替える方法|選択ソートの仕組みと実装例を解説

    C++では、さまざまなソート(並べ替え)アルゴリズムを使って配列を整列できます。ソート済みの配列とは、数値の大小順やアルファベット順など、何らかの基準に従って要素が並び替えられた配列のことです。代表的なソートアルゴリズムには、バブルソート、挿入ソート、選択ソート、マージソート、クイックソート、ヒープソートなどがあります。本記事では、その中でも構造がシンプルで理解しやすい「選択ソート」を取り上げ、実際のコード例とともに詳しく解説していきます。 選択ソートとは? 選択ソートは、未ソート部分の中から最小値を繰り返し探し出し、それを未ソート部分の先頭にある要素と交換することで、配列全体を昇順に整列さ

  2. C++で配列を使ってキューを実装する方法|完全なコード例と詳しい解説

    キューとは?FIFO方式の基本キュー(Queue)とは、複数の要素を格納する抽象的なデータ構造です。キューはFIFO(First In First Out:先入れ先出し)方式を採用しており、最初に挿入された要素が最初に取り出されます。言い換えれば、最も古く追加された要素から順に削除されていくのがキューの大きな特徴です。日常の行列(待ち列)と同じ動きをするイメージを持つと分かりやすいでしょう。ここでは、配列を使用してキューを実装するC++プログラムを紹介します。C++によるキュー実装の完全なコード例次のプログラムは、配列をベースにキューの「挿入」「削除」「表示」を行うメニュー形式のコンソールアプ