続:pythonistaがC++で配列を扱ってみる.(arrayクラス,vectorクラス)
目次
はじめに
前回,C++の配列について扱ってきましたが,C++には特別な配列があるみたいです.pythonでいうとnumpy.ndarray
みたいなものですかね〜.
具体的にはarray
クラスとvector
クラスがあるようですので,pythonと比較しながら早速触ってみようと思います.
こちら参考文献です=> それではいきましょう〜
arrayクラス
C++でarray
クラスを使いたい時は <array>
をインクルード(include
,pythonでいうimport
)すると使うことができるようです.
宣言はarray<型, 配列の長さ> ary
で行うようです.
#include <iostream> #include <array> using namespace ::std; int main(){ array<int, 5> ary={1,2,3,4,5}; //ary{1,2,3,4,5}でもOKらしい for (int i=0; i<5; i++){ cout << ary[i] << ", "; } }
実行結果
1, 2, 3, 4, 5,
前回と何が違うのでしょうか?
一番大きな違いが,いろいろなmethod
を使えて便利ということです.
例えば,全ての要素を何かに変えたい時はarray.fill(何か)
などを使えるそうです.
#include <iostream> #include <array> using namespace ::std; int main(){ array<int, 5> ary = {1,2,3,4,5}; for (int i; i<5;i++){ cout << ary[i] << ", "; } cout << endl; ary.fill(10); for (int i; i<5;i++){ cout << ary[i] << ", "; } }
実行結果
1, 2, 3, 4, 5, 10, 10, 10, 10, 10,
これをpythonで書くとこんな感じですかね.
import numpy as np ary = np.array([1, 2, 3, 4, 5]) print(ary) ary[:] = 10 print(ary)
[1, 2, 3, 4, 5,] [10, 10, 10, 10, 10,]
やっぱりC++と比較するとすごく簡単にかけますね〜.
ちなみに,numpy.ndarray
じゃないとary[:] = 10
みたいにはかけないので注意です.
C++のarray
についてまとめると,
C++の普通配列より少し便利なmethod
がある
ということですね.pythonでいうnumpy.ndarray
みたいな感じかな?
ちなみにnumpyのようにary.mean()
みたいに平均などを求めれるというわけでは
ないようですのでC++のarray
はそんなにありがたみを感じない...
きっと他にも便利なmethod
があるはずなので,詳しくはレファレンスをご覧ください. array - C++ Reference
vectorクラス
array
クラスと同様に,vector
を使うためにはインクルードをする必要があります.
宣言はvector<型> vec
で行うようです.実際に下記のように使ってみました.
#include <iostream> #include <vector> using namespace ::std; int main(){ vector<int> vec; for (int i=1; i<=5;i++){ vec.push_back(i); } for (int i; i<5;i++){ cout << vec[i] << ", "; } }
実行結果
1, 2, 3, 4, 5,
vector
クラスの一番の特徴は,
pythonでいうlist
ライクに使えるということですね.
vector.push_back()
がlist.append()
に対応しているように,要素数を途中で変更できたり,要素を追加できることがすごい便利ですね.
比較でpythonのコードを書くとしたらこんな感じです.
vec = [] for i in range(1,6): vec.append(i) print(vec)
実行結果
[1, 2, 3, 4, 5]
うん.やっぱりpythonはすっきりしていますね
ただ,list
を使うコードの実行速度が遅くなることで有名ですが,C++の配列やarray
と比べてvector
は多少は遅くなるそうですがその差は微々たるもので,ほどんど変わらないようです.
また,pythonのlist
は, どんな型でもappend
できるのに対して,vector
は1つvectorに1つの型しか入れられないらしいです.
ちなみにarray
と同様にvector
にもいろいろ便利なmethod
もあるらしいですが,こちらは割愛しようと思います.
二次元配列
いままで紹介したC++ のarray
, vector
,さらに参考のためpythonのnumpy.ndarray
およびlist
で
の配列
をつくって終わろうと思います.
まず先に,コードを書いちゃうとこんな感じです.
#include <iostream> #include <array> #include <vector> using namespace ::std; int main(){ array <array<int, 3>, 3> ary2d = {array<int, 3>{1,2,3}, array<int, 3>{4, 5, 6}, array<int, 3>{7,8,9}}; for (int i=0; i<3;i++){ for (int j=0; j<3;j++){ cout << ary2d[j][i] << ", "; } cout << endl; } cout << "=========" << endl; vector <vector<int>> vec2d{{1,2,3},{4,5,6,},{7,8,9}}; for (int i=0; i<3;i++){ for (int j=0; j<3;j++){ cout << vec2d[j][i] << ", "; } cout << endl; } }
出力結果
1, 4, 7, 2, 5, 8, 3, 6, 9, ========= 1, 4, 7, 2, 5, 8, 3, 6, 9,
import numpy as np list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] print(list) print("=========") ary = np.array(list) print(ary)
出力結果
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] ========= [[1 2 3] [4 5 6] [7 8 9]]
こんな感じで,二次元配列を扱うみたいです.C++は二次元配列の宣言文書くの面倒だし,array
クラスの初期化もこれまた面倒だ.
まあ仕方ないですが,やっぱりpythonは簡単で便利ですね.
面白かったのは,list
とnumpy.ndarray
で出力結果が違うところですね.numpy.ndarray
の方がみやすいです.行と列の向きがガバガバですがまあいいでしょう.そこら辺はコーディングの都度確認しておきます.
おわりに
今回は,C++のarray
とvector
で1次元及び2次元の配列を扱いました.
C++とpythonの比較も行い,pythonが簡単であることを改めて思いましたね.
しかしC++のvector
などはpythonよりは書くのが面倒ですが,思ったより難しくなかったです.
今後も引き続きC++をpythonから呼び出すためにいろいろ勉強していきます. 次回はC++で複素数を扱ってみてpythonと比較してみたいと思います.
ではまた(✿╹◡╹)