配列

array.png

変数がコーヒーカップならば配列はcarry trayのようなもの、といいますが[2]

配列操作のお便利クラス

配列の長さ

ポインタテクニックを使って求めることができる。

string names[]={"ModelView","Proj","map","slice","clip_eqn"};
    int size = sizeof(names) / sizeof(names[0]);

なぜそうなるのか?
分子のnames[0]はnames[1]でもなんでもいい。配列の要素のどれかならば。

sizeof(names[0]);

は、配列の要素一個あたりのサイズになる。
だから、型がわかってれば

sizeof(string);

と書いてもいい。

sizeof(配列名)

は何を意味しているか?
メモリの中で配列はここからここまで、と区切ってある区間のサイズをバイト数で示しているのだ。

配列の宣言に使える数値

  • const int NUM=10;
  • #define NUM 10
  • enum{NUM=10};enumハックと呼ばれているらしい。
double miffyarray[NUM];

For Eachでらくらくループ

foreach

配列の中身をプリントする

 vector<string> a{"ab","aba","A"};
 for_each(a.begin(),a.end(), [](auto p){cout << p << ","; });

組み込み配列の場合
#include <iterator>
int arr[3];
    arr[0] = 2;
    arr[1] = 4;
    arr[2] = 6;
    for_each(begin(arr), end(arr), [](auto p) {cout << p << ","; });

Visual Studioのデバッグ時に配列の中身をみる

ウォッチの名前の部分に、ポインタ変数名に ,(カンマ)と表示する個数を追加します。
【VisualStudio】ウォッチでポインタの中身を参照する

各言語の配列操作比較表

ネイティブ言語編

項目 C C++(std::vector) java Java(ArrayList)
配列の初期化 int a[16]={1,2,…}; vector<int> a(t, t+sizeof(t)/sizeof(t[0])); int[] a={1,2,..};([]の中に数字を入れてはいけないint a[]でもok) ArrayList<int> a=new ArrayList<int>();
配列の初期化 int a[16]; int[] a = a(16);
配列の初期化 int *a=new int[16]; int[] a=new int[16];
配列の0クリア int a[16]={0};
配列を同じ値で埋める fill(begin,end,val)
配列の長さ for eachかsizeof vector<T>.size() array.length
関数の引数が配列の時 void method(int *_a); void method(int[] _a);
配列を回すとき for (int i = 0;i < num ;i++) for (int i = 0;i < array.length;i++)
配列のコピー memcpy() copy()

Web系言語編

Ruby(Array) Python(list) JavaScript(Array) Perl(@) C++(std::vector)
初期化 a = [1, 2, 3] a = [1, 2, 3] a = [1, 2, 3]
配列の長さ a.length len(a) a.length scalar(@a)*1$#a + 1 a.size()
配列のコピー copy
配列が空かどうか a.empty? len(a) == 0 a.length == 0 !scalar(@a)*1$#a == -1 a.empty()
要素を後ろに足す a.push(x) a.append(x) a.push(x) push(@a, $x) a.push_back(x)
要素の挿入 a.unshift(x a.insert(0, x) a.unshift(x) unshift(@a, $x) a.insert(a.begin(), x) *2
要素の取り出し a.pop a.pop() a.pop() pop(@a) a.pop_back()*3*4
要素の削除 a.shift a.pop(0) a.shift() shift(@a) a.erase(a.begin())*5*4
要素の結合 a.concat(b) a.extend(b) a = a.concat(b) push(@a, @b) a.insert(a.end(), b.begin(), b.end())
配列のクリア a.clear a[:] = [] a.length = 0 @a = ()undef @a$#a = -1 a.clear()
splice? a.insert(i, x) a.insert(i, x) a.splice(i, 0, x) splice(@a, $i, 0, $x) a.insert(a.begin() + i, x)
要素の全部削除 a.delete(x) a.remove(x) *6 @a = grep {$_ != $x} @a a.erase(remove(a.begin(), a.end(), x), a.end())
指定要素の削除 a.delete_at(i) del(a[i]) a.splice(i, 1) splice(@a, $i, 1) a.erase(a.begin() + i)
要素の数 a.nitems {|e| e == x }*7 a.count(x) grep {$_ == $x} @a*8 count(a.begin(), a.end(), x)
要素の検索 a.include?(x) x in a (grep {$_ == $x} @a) != 0 find(a.begin(), a.end(), x) != a.end()
? a.index(x) a.index(x) find(a.begin(), a.end(), x) - a.begin()
先頭の要素 a.first a[0] a[0] $a[0] a.front()*4
最後尾の要素 a.lasta[-1] a[-1] a[a.length-1] $a[-1] a.back()
スライス a[i,l]a.slice(i, l) a[i:i+l] a.slice(i,i+l) @a[$i..$i+$l-1]
? a[i..j]a.slice(i..j) a[i:j+1] a.slice(i,j+1) @a[$i..$j] vector(a.begin() + i, a.begin() + j + 1)
配列の確保 list1 = [],list2 = list()1 var array=new Array() int arr=new int[100]
Ruby(Array) Python(list) JavaScript(Array) Perl(@) C++(std::vector)

配列のインデックス超えたエラーのキャッチ

 catch( ArrayIndexOutOfBoundsException e ) 
 
  { 
   System.out.println( "Valid indexes are 0, 1,2,3, 4,5,6 or 7" );
  }

可変長配列をただの配列に変換する

C#の場合

using System.Collections;
 ArrayList ans = new ArrayList();
 (int[])arraylist.ToArray(typeof(int));


c java pert python ruby

サポートサイト Wikidot.com cjavapertpythonruby