원본출처
http://lunapiece.net/3800
이번엔 lexical_cast 에 대해서 알아보자.
cast 란 이름에서 눈치챗겠지만 일종의 캐스팅 연산자(인 척 하는 함수) 이다.
string -> Integer 같은 상식적으론 말이 되지만 C++문법상으론 말이 안되는 일들을 처리한다.
일단 예제코드를 소개한다.
timer 에 관해서는
http://lunapiece.net/3795 를 참조해라
#include <boost/lexical_cast.hpp>
#include <cstdlib>
#include <string>
#include <boost/timer.hpp>
using namespace std;
using namespace boost;
string Number = "1024768";
void StrToIntAtoi()
{
int num;
for(int i=0;i < 1000000; ++i)
{
num = atoi(Number.c_str());
}
printf("atoi : %d\n", num);
}
void StrToIntStringStream()
{
stringstream sst;
int Num;
for(int i=0;i < 1000000; ++i)
{
sst << Number.c_str();
sst >> Num;
}
printf("StringStream : %d\n", Num);
}
void StrToIntLexicalCast()
{
int num;
for(int i=0;i < 1000000; ++i)
{
num = lexical_cast<int>(Number);
}
printf("LexicalCast : %d\n", num);
}
int _tmain(int argc, _TCHAR* argv[])
{
timer t;
printf("atoi 를 이용 한 방법\n");
t.restart();
StrToIntAtoi();
printf("%lf 초\n", t.elapsed());
printf("StringStream 을 이용 한 방법\n");
t.restart();
StrToIntStringStream();
printf("%lf 초\n", t.elapsed());
printf("lexical_cast 를 이용 한 방법\n");
t.restart();
StrToIntLexicalCast();
printf("%lf 초\n", t.elapsed());
return 0;
}
.....
예제코드 자체는 별 문제가 없었으리라 본다. 준비작업도 필요없고 간단하게 쓸 수 있어서 참 좋아보이기는 한다.
하나의 함수로 이런저런 캐스팅을 다 할수 있으니 다형성도 뛰어나다.
그러나 치명적인 문제가 딱 하나 있는데...
첨부파일에 있듯이 바로 속도 =_=;
stringstream 에 비해 약 10배, atoi 에 비해선 대략 50배 가량 느리다 =_=;; 편의성을 위해서 가끔 쓰는정도라면 몰라도 자주 반복되는 루틴에서는 쓰지 않아야 하겠다.
String Number2 = "1024768";
void VCLStrToInt()
{
int num;
for(int i=0;i < 1000000; ++i)
{
num = StrToInt(Number2);
}
printf("StrToInt : %d\n", num);
}
vcl의 StrToInt함수를 사용하니 atoi보다 빠르게 나오네요.;;