C++ での型の変換などのいろいろな変換方法を書いておきます.競技プログラミング用途です.ソース冒頭に次のように書いてあるものとします.
#include <bits/stdc++.h>
typedef long long int ll;
using namespace std;
文字列→数値
std::stoi, std::stoll を使う.2進数などを読みたいときは,base を指定すれば良い.
int stoi( const string& str, size_t* pos=0, int base=10 );
long long stoll( const string& str, size_t* pos=0, int base=10 );
使用例
string s1 = "101";
ll x = stoll(s1); // x == 101
ll y = stoll(s1, 0, 2); // y == 5
似たような名前で std::strtoll などもあるが, これらは引数に const char* を取る. const string& を引数に取る stoll などの方が便利だろう.
実数への変換は,std::stod, std::stold を使う.
double stod( const string& str, size_t* pos = 0 );
long double stold( const string& str, size_t* pos = 0 );
数値→文字列
std::to_string を用いる.
string to_string( int value );
string to_string( long long value );
string to_string( unsigned value );
string to_string( unsigned long long value );
string to_string( double value );
string to_string( long double value );
16進表記文字列にしたいとか 8進にしたいとかいう場合には, 1つの関数を適用して終わりというわけにはいかないように思う. 次のような感じだろう.
ll value = 256;
stringstream ss;
ss << hex << value;
string s = ss.str(); // s == "100"
8進にするときには hex の代わりに oct を用いる.
2進の場合はbitsetを用いる. 下の例では,value2 の2進表現が長さ8の文字列になる.
ll value2 = 30;
string s2 = bitset<8>(value2).to_string(); // s2 == "00011110"
実数→整数
普通にキャストすれば良い場合も多いが,いろいろ罠がある.
double d = -26.001;
ll x = ll(d + 0.5); // x == -25 (!!)
これは,dが負の場合には意図したようには動作しない. 0に向かって丸められてしまうからである. 次を用いる.
double d = -26.001;
ll x = llround(d); // x == -26
round関数などのsignature は以下のようになっている.
double round ( double arg );
long double roundl( long double arg );
long lround ( double arg );
long lroundl( long double arg );
long long llround ( double arg );
long long llroundl( long double arg );
定数の 1,000,000,007 などを書くのが面倒で,
const ll mod = 1e9 + 7;
などと書いてしまうことがある.上の例は意図したように動くようであるが,
const ll big1 = 1e18;
const ll big2 = 1e18 + 1;
については,big1 も big2 も 同じ値になってしまう. (gccの場合) double の精度は十進で15桁くらい,long double は18桁くらいである.