数値を数字に
大量にファイルがある場合等、番号をそのままファイル名にしたりするときに便利です。でもこれ、C++標準関数としては存在しないんですよね。boost::lexical_castが非常に便利ですが、しかしこれ、マニピュレータみたいなのがないんですね。つまり、5桁で統一とか。まあ、そのくらいはstringクラスつかえば簡単だろうという話もあるが、それすら面倒な人間なんですね私は。
というわけで作りました。
std::string NumToString( unsigned int num, int size ) { std::string result; std::string::iterator it = result.begin(); if( num == 0 ){ result = '0'; size--; } while( num > 0 ){ const char c = static_cast< char >( num % 10 + '0' ); it = result.insert( it, c ); num /= 10; size--; } while( size > 0 ){ it = result.insert( it, '0' ); size--; } return result; }
いや、こういうの作るほうが面倒だろうというツッコミはなしで。sizeで桁数を指定すれば、元の桁数が多い場合は無視して少ない場合はうえの桁を0で埋めてくれます。同じことをboost::lexical_castで同じことをやったら倍以上時間がかかりました。何でもできるということはその分遅くなるということか?
stringクラスはあまり使い慣れてないのですが、なんでpush_frontとかないんでしょうね?おかげでなんだか妙なことをやっておりますが・・・・。ついでに、最初、insertの戻り値を指定するのを忘れていたら、sizeが16を超えたら例外を吐いてきました。(逆に16未満なら問題なく動いた)「stringって、16個しか使えなかったっけ?」などとふざけたことを考えたりしました。どうやらstringは16を境にメモリが変わるみたいですね。vectorは2^nごとに変わるということを聞いたことがあるのでそれと同じなんでしょうかね?