« 2015年12月 | トップページ | 2016年4月 »

2016年3月の2件の記事

2016-03-21

StrinToIntのような文字列を整数に変換する関数を実装してみる

Abstract1176852_640

ちなみにatoiなど標準ライブラリーなどの関数を使うべきですが、純粋に文字列をint型にするのではなく、なにか似たような処理をする時のヒントになればと思います。

文字列の先頭から一文字取得して、数字に変換する。取得した文字を文字列から取り除く。文字列にまだ文字があれば、取得した数値を10倍する。

#include <iostream>
#include <string>

using namespace std;

int string_to_int(string s)
{
    int result = 0;
    while (s.length() != 0)
    {
        result += s[0] - '0';
        s = s.substr(1, s.length() - 1);
        if (s.length() != 0)
        {
            result *= 10;
        }
    }
    return result;
}

int main()
{
    string s = "123";
    cout << string_to_int(s) + 111 << endl;  // 234
    return 0;
}


アルゴリズムの基本




| | コメント (0) | トラックバック (0)

2016-03-03

インライン化できない関数のラッパー関数などで関数呼び出しのオーバーヘッドを減らしたい



オブジェクトを返すとか、例外を投入するだけでインライン化できない関数だが、既存関数の引数が固定のラッパー関数とかで、ループの中で頻繁に呼び出されたりするような関数を用意したいことがある。

だったら、マクロ化しまうのもひとつの手かと。


大量の引数を取る関数が何度も呼ばれるような場合で、呼び出しごとに変化する引数はひとつだけだというような場合には、他の引数は固定しておく事ができる。しかしラッパー関数を作ってしまうと、ラッパー関数の呼び出しと、ラッパー関数から呼ばれる本質の関数を呼び出すという、一度の関数呼び出しで二度ずつオーバーヘッドが発生する。子のオーバーヘッドが無視できれば、関数にしておいた方がソースの可読性は向上すると思うが、オーバーヘッドが無視できないようなケースではマクロ化してしまえば、オーバーヘッドを回避することができる。


C++ではマクロよりインライン関数を使うべきという説をよく見るので、インライン化できないと通常の関数化してしまいがちだが、普通にC言語のようにマクロ化してしまった方が有効な場合もある。




style="display:inline-block;width:300px;height:250px"
data-ad-client="ca-pub-1099589974703718"
data-ad-slot="4338286575">





| | コメント (0) | トラックバック (0)

« 2015年12月 | トップページ | 2016年4月 »