続:pythonistaがC++で配列を扱ってみる.(arrayクラス,vectorクラス)

目次

はじめに

前回,C++の配列について扱ってきましたが,C++には特別な配列があるみたいです.pythonでいうとnumpy.ndarrayみたいなものですかね〜. 具体的にはarrayクラスとvectorクラスがあるようですので,pythonと比較しながら早速触ってみようと思います.

こちら参考文献です=> それではいきましょう〜

arrayクラス

C++arrayクラスを使いたい時は <array>をインクルード(includepythonでいう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は多少は遅くなるそうですがその差は微々たるもので,ほどんど変わらないようです. また,pythonlistは, どんな型でもappendできるのに対して,vectorは1つvectorに1つの型しか入れられないらしいです.

ちなみにarrayと同様にvectorにもいろいろ便利なmethodもあるらしいですが,こちらは割愛しようと思います.

二次元配列

いままで紹介したC++array, vector,さらに参考のためpythonnumpy.ndarrayおよびlist {3 \times 3} の配列 {
\begin{bmatrix}
1, 2 ,3 \\
4, 5,6  \\
7,  8, 9  \\
\end{bmatrix}
} をつくって終わろうと思います. まず先に,コードを書いちゃうとこんな感じです.

C++

#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, 

python

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は簡単で便利ですね.

面白かったのは,listnumpy.ndarrayで出力結果が違うところですね.numpy.ndarrayの方がみやすいです.行と列の向きがガバガバですがまあいいでしょう.そこら辺はコーディングの都度確認しておきます.

おわりに

今回は,C++arrayvectorで1次元及び2次元の配列を扱いました. C++pythonの比較も行い,pythonが簡単であることを改めて思いましたね. しかしC++vectorなどはpythonよりは書くのが面倒ですが,思ったより難しくなかったです.

今後も引き続きC++pythonから呼び出すためにいろいろ勉強していきます. 次回はC++複素数を扱ってみてpythonと比較してみたいと思います.

ではまた(✿╹◡╹)