C++の基本

C++標準ライブラリ

C++には標準ライブラリというものがあり、様々なアルゴリズムやデータ構造を難しいプログラミングをせずに利用できます。非常に多種類のアルゴリズムがありますが、特に重要なものでOpenCVプログラミングでよく使うのはiostream、vector、math.h、の3つでしょう。

インクルード

例えば、vectorライブラリを使うときには、#include をプログラムの先頭に書きます。int main()よりも前です。これによってライブラリをインクルード、すなわち取り込んだことになり、そのライブラリ内のアルゴリズムを使えるようになります。

名前空間

標準ライブラリを使うときには、#include 文の後にusing namespace std; という文を書くようにしてください。これがないと後で標準ライブラリ内の関数を使ったときに、その関数が標準ライブラリのものなのかわからないというエラーになります。

iostream

入力、出力を簡単に行うことができます。cinは入力関数、coutは出力関数です。これらの関数は「>>」または「<<」という特殊な演算子を使用します。下の例では入力した数字を4倍してから出力します。なお、endlは改行するときに使います。

#include <iostream>
using namespace std;
int main(){
    double num=0;
    cin>>num;
    cout<<num*4<<endl;
    return 0;
}

vector

大きさが自由に変えられる可変長配列を宣言できます。vectorを扱う関数はたくさんありますが、よく使うのは、要素数を返すsize()、任意番目の要素にアクセスするat()、末尾に追加するpush_back()、末尾を削除するpop_back()、要素をすべて削除するclear()関数だと思います。るclear()関数だと思います。

#include <stdio.h>
#include <vector>
using namespace std;
int main(){
    vector<int> vec; //vecという名前のint型の可変長配列を宣言
    vec.push_back(10); //末尾に10を追加
    vec.push_back(12); //末尾に12を追加
    vec.pop_back(); //末尾を削除(12を削除)

    vec.push_back(12); //末尾に12を追加
    vec.push_back(15); //末尾に15を追加
    for(int i=0; i<vec.size();i++){ //vecのすべての要素に繰り返し処理をする
        printf("%d\n",vec.at(i)); //i番目の要素を出力
    }
    vec.clear(); //要素をすべて削除
    return 0;
}

vec1 vec2

math.h

数学的な計算を簡単に行えます。三角関数のsin、cos、tan、さらにこれらの逆関数のasin、acos、atanの他、累乗計算を行うこともできます。最もよく使うのが、累乗計算のpow関数かもしれません。実はこのpow関数を使って平方根を計算できます。平方根を取るにはどうすれば良いでしょうか??(答えはこちら)

#include "math.h"
using namespace std;
int main(){
    double value = cos(3.141592); //余弦を求める
    value = acos(0.5); //逆余弦を求める
    value = fmax(1.3,2); //最大値を求める
    value = pow(2,3); //累乗を求める ここでは2の3乗で8
    copysign(-5,value); //valueの絶対値に-5の符号をつける
    return 0;
}

random

乱数を作る時に用います。このライブラリは様々な性質を持つ乱数を生成できますが、ここでは最も簡単に使える、random_deviceの用法だけ紹介します。random_device rnd; というようにしたあとに、rnd()とすれば、乱数が生成されます。この乱数は最小値0、最大値4294967295を持ちます。ちなみに、4294967295は232-1の値です。以下のコードでは、出力する乱数の範囲を0~1にするために、最大値4294967295で割っており、forを使って10個の乱数を出力しています。このrandom_device関数で得られる乱数は、区間内で全ての実数が同じ確率で現れる一様乱数となります。

#include <random>
#include <iostream>
using namespace std;
int main()
{
    random_device rnd;
    for (int i = 0; i < 10; i++) {
        cout << rnd()/4294967295.0 << endl;
    }
    return 0;
}