雑談

ふとした時に雑談を投下します.内容はロボットのことだったりそうでなかったり.

C++で複数の戻り値を返す

PythonMATLABでは複数の戻り値を簡単に返すことができるがC++でも出きるのか調べてたらstd::tupleを使用することで可能らしい.

以下にサンプルコードを示す.

#include <iostream>
#include <tuple>

std::tuple<int, std::string> get_return_value()
{
    return std::forward_as_tuple(11, "test");
}

int main()
{
    int a;
    std::string b;

    std::tie(a,b) = get_return_value();

    std::cout << a << " " << b.c_str() << std::endl;

    return 0;
}

関数宣言の際,戻り値の型をstd::tupleとし,returnで戻す際にstd::forward_as_tupleとして返すことで複数値戻すことができる.受け取る際はstd::tieで受け取る.これはc++11で出きるのでコンパイル際はオプションつけてコンパイルすることを忘れずに.

c++17だと,return {11, "test"}; みたいな感じで返すことが出きるらしいので少し簡単に記述できるようだ.

結論

同じことをstd::tupleでC++でも行えるが,一手間必要なのでちょっと面倒くさい.やはりPython神か.

vectorの要素の合計を計算

vectorの要素を全て足し合わせたいときに関数一発叩けば出来ないかなと思っていたらaccumulateを使えば出来るらしい.僕は低能なのでfor文使ったろうかって考えてた.

とりあえず以下にテストコードを示す.

#include <iostream>
#include <random>

using namespace std;

int main(int argc, char *argv[])
{
    vector<double> vec;
    std::random_device rd;
    std::mt19937 mt(rd());
    uniform_real_distribution<double> score(0.0,10.0);

    for(int i=0;i<10;i++)
        vec.push_back(score(mt));
    
    cout << "sum=" << accumulate(vec.begin(), vec.end(), 0.0) << endl;

    return 0;
}

内容としては簡単だが,10個ランダムの値を生成しvecに格納する.その後accumulateを呼び出し合計を計算している.このaccumulateであるが,第一引数,第二引数にはvectorの先頭,末尾の値をいれる.第三引数であるが,しらべたら初期値を入れてあげるらしい.

この関数を使用すれば合計を計算した後データの総個数で割れば平均を出すことも簡単である.一行で完結してしまうので非常に便利.