2011-11-22 3 views
5

문자열에서 64 비트 부호없는 정수 unsigned long long을 읽는 문제를 다루고 있습니다. Read 64 bit integer string from filestrtoull이 일을 잘하고보다 효율적으로 std::stringstream를 사용하는 것보다 할 것이라고 thougth : 내 코드는 모두 GCC 4.3 및 Visual Studio 2010문자열에서 64 비트 정수로 변환

내가이 주제에 대한이 질문과 답변을 읽어 작동합니다. 불행히도 strtoull은 Visual Studio의 stdlib.h에서 사용할 수 없습니다.

template <typename T> 
T ToNumber(const std::string& Str) 
{ 
    T Number; 
    std::stringstream S(Str); 
    S >> Number; 
    return Number; 
} 

unsigned long long N = ToNumber<unsigned long long>("123456789"); 

내가 지금이 솔루션의 효율성에 대한 걱정이 escenario에서 더 나은 옵션이있다 :

그래서 나는 짧은 템플릿 기능을 썼다?

+1

앱의 가장 인기있는 곳입니까? –

+0

@ 바이올렛 : 실제로는 아니지만 GUI를 새로 고치기 위해 주기적으로 큰 파일을로드하므로 최대한 원활하게 실행하고 싶습니다. –

+1

자신 만의 변환을 작성할 수 있습니다. 'stringstream'을 사용하는 것보다 빠를 가능성이 높습니다. 여기 벤치 마크를 참조하십시오 : http://tinodidriksen.com/2010/02/16/cpp-convert-string-to-int-speed/ – Pablo

답변

4

http://social.msdn.microsoft.com/Forums/en-US/vclanguage/thread/d69a6afe-6558-4913-afb0-616f00805229/

"다라고 _strtoui64(), _wcstoui64()와 _tcstoui64(). 플러스 사용자 정의 로케일에 대한 _L 버전을.
한스 옆모습"을 참조하십시오.

그런데 Google과 같은 방식은 Google이 자동으로 여러분이 틀렸다고 생각하는 것입니다 (새 버전의 Visual Studio와 유사). 대신 다른 것을 검색하므로 클릭하십시오. 검색 할 링크를 찾으십시오.

건배 & HTH.,

+0

@anonymous downvoter : 다른 사람들이 어리석은 이유를 알 수 있도록 downvote를 설명해주십시오. 그것. –

2

물론 간단한 십진수 문자열을 처리 할 수있는 함수를 쉽게 작성할 수 있습니다. 표준 함수는 숫자 기반과 로케일에 따라 다양한 대안을 처리하므로 어떤 경우에도 속도가 느려집니다.

예, stringstream은 모두 위에 힙 할당을 추가합니다. 아니, 성능 차이는 말할 필요가 없을 때까지 중요하지 않습니다.

버퍼를 소유하지 않으므로 더 이상 사용되지 않는 std::strstream 클래스를 사용하는 것이 더 빠릅니다 (따라서 복사를 수행하거나 할당을 수행하지 않습니다). 나는 그것을 "더 나은"이라고 부르지 않을 것이다.

1

사용자가 문자열을 해석 할 수있는 후방부터 1 000 000 000^I, 즉 (마지막 8 자리 * 1) + (다음 8 자리 곱한 한번에 9 자리 * 10 억) ... 또는

(1000000000000000000)+(234567890000000000)+(123456789) 
+0

'strtoul'에 대한 여러 호출을 하나의'strtoull'으로 결합하려는 경우, 소수가 아닌 기본에서는 작동하지 않습니다. 그는'number = number * 10 + character - '0'으로 반복하는 것이 더 낫습니다. – Potatoswatter