2005年8月27日

配列操作の比較表: Ruby, Python, JavaScript, Perl, C++

プログラムを書いていると、他のプログラミング言語の記憶とごっちゃになって、「配列の後ろに要素を追加するのは push だっけ、 append だっけ」などと混乱することがあります。特に Ruby, Python, JavaScript はコードの書き方が似ているので、この問題が起きがちです。

そこで、備忘録として、 Ruby, Python, JavaScript, Perl, C++ の配列操作の比較表を作りました。一番慣れている Ruby を基準にしています。間違いなどがあったらご指摘いただけると助かります。他の言語のもあるといいなあ。

 
Ruby
(Array)
Python
(list)
JavaScript
(Array)
Perl
(@)
C++
(std::vector)
a = [1, 2, 3] a = [1, 2, 3] a = [1, 2, 3] @a = (1, 2, 3) int t[] = {1, 2, 3};
vector a(t, t+sizeof(t)/sizeof(t[0]));
a.length len(a) a.length scalar(@a)*1
$#a + 1
a.size()
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()
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.last
a[-1]
a[-1] a[a.length-1] $a[-1] a.back()*4
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)
a[i...j]
a.slice(i...j)
a[i:j] a.slice(i,j) @a[$i..$j-1] vector(a.begin() + i, a.begin() + j)
a.sort sorted(a) sort(@a)
a.sort! a.sort() a.sort() @a = sort(@a) sort(a.begin(), a.end())
a.reverse reversed(a)*9 reverse(@a) vector<...>(a.rbegin(), a.rend())
a.reverse! a.reverse() a.reverse() @a = reverse(@a) reverse(a.begin(), a.end())
a.uniq do{ my %s; grep { !$s{$_}++ } @a }
a.uniq! @a = do{ my %s; grep { !$s{$_}++ } @a } a.erase(unique(a.begin(), a.end()), a.end())*10
a.join(d) d.join(a) a.join(d) join(d, @a)
a.each {|x|
  ...
}
for x in a:
  ...
for (var i in a) {
  var x = a[i]
  ...
}
for my $x (@a) {
  ...
}
for (vector::const_iterator
      iter = a.begin();
      iter != a.end();
      ++iter) {
  const T& x = *iter;
   ...
}
  1. if (@a > 5) や if (!@a) と書ける (スカラーコンテキスト)
  2. vector::push_front() はない
  3. vector::pop_back() に返り値はない (void)
  4. a が空のときの動作は未定義
  5. 先頭の要素を削除するだけ (先頭の値は得られない)
  6. 最初の1つしか削除されない
  7. Ruby 1.9 から
  8. スカラーコンテキストだと見つかった数が返る
  9. listreverseiterator というオブジェクトが返る
  10. a はソート済みでなければならない

他の言語の場合

リンク集

謝辞

以下の方々から間違いの指摘や改良案などのコメントをもらいました。ありがとうございます。