2013-10-08 2 views
4

면책 조항 : 링크 std::atoi이되지 않으며 그 대신 std::strtol 사용을 권장하고 있다고 그래서 내가 잠시 동안 알고std :: strtol과 std :: stoi의 차이점은 무엇입니까?

을 cppreference.com한다.

C++ 11은 std::stoi을 도입했으며 왜 내가 하나를 사용하려고 선택하는지 이해하려고 시도하고 있습니다. std::strtol.

내가 이해하는 바로는 stoi는 strtol을 호출하지만 예외를 throw합니다. 또한 정수 대신 long을 반환합니다.

주요 차이점은 무엇입니까?

+0

[가능한 이유가 없습니다 : stou :: stou?] (http://stackoverflow.com/questions/8715213/why-is-there-no-stdstou) –

+0

@KerrekSB 그건 정말 관련이없는 질문입니다 ... –

+0

@ KerrekSB 내 질문은 궁극적으로 그냥 strtol 전화한다면 stoi를 사용하는 이유를 더 잘 이해하는 것입니다. – jmstoker

답변

7

이러한 주요 차이점은 무엇입니까?

더 새로운, std::stoistd::string에서 직접 작동 (그래서 당신은 쓰레기에 .c_str() 통화 서비스 코드가없는)와 선택적으로보다는하는 size_t를 통해 당신에게 인덱스로 첫 타의 추종을 불허하는 문자를 제공합니다 포인터.

이러한 변경 사항은 코드 내에서의 사용을 단순화합니다.

+0

문자열을 변환하고 int를 반환하기 위해 내부 주조로 인해 약간의 오버 헤드를 희생하여 편리함을 제공한다고 가정하는 것이 안전할까요? – jmstoker

+0

@jmstoker 만약 당신이'std :: string'을 입력으로 사용한다면 동일한 변환을해야하므로 오버 헤드가 많이 발생하지 않을 것으로 생각됩니다. –

+0

맞아요, 예외를 제공하는 로직처럼 stoi에서 더 많은 일이 일어나고 있는지 궁금합니다. 아마 분석을 끝내 겠지만 흥미가 있습니다. – jmstoker

2

하나 개의 큰 차이는 stoi이 인수로 std::string을한다, 그래서 당신은 정수로 변환 할 문자열에 .c_str()을 압정 할 필요가 없다는 것입니다.

당신이 long로 변환 할 경우, 대신 stol을 사용할 수 있습니다 (마찬가지로, stod, stofstold, stoul, stoll 각각 double,float, long double, unsigned longlong long로 변환).

2

std::basic_string을 전달하려는 경우 int을 받고 싶다면 std::stoi()을 사용하십시오. long을 얻으려면 std::stol()으로 전화하십시오.

0

std:stoi은 C 호환이 아니며 C 컴파일러로 컴파일 할 수없는 다른 객체 지향 구현을 가진 <string> 라이브러리로 포장되어 있습니다. 주된 유스 케이스 시나리오 (should)에는 현대 C++ 관례를 따르기위한 바이트 배열 대신 std : string이 포함됩니다.

-2

실제로 왜 std :: FromString 템플릿 함수가 템플릿 매개 변수로 변환 된 문자열을 원하는 형식을 취하지 않는지 궁금합니다. 마찬가지로 ToString 템플릿 함수는 그 역순입니다.

삽입 및 추출 연산자를 사용하여 구현을 쉽게 상상할 수 있습니다.

int i = std::FromString <int> (std::string ("2")) 
int j = std::FromString <int> ("2") 

std::string = ToString <double> (3.14159) 

물론 함수 이름에는 대문자가 포함되지 않으며 from_string 및 to_string 일 가능성이 높습니다.

물론 템플릿 전문화가 가능합니다. 마지막으로 유형이 네이티브 유형이어야한다는 제한은 없습니다. 맞습니까?

+0

-1. 질문에 대답하지 않습니다. –

+0

참. 그것은 "질문에 대답하지 않는다". 하지만 두 개의 템플릿을 만드는 것은 매우 쉽습니다. 실제로 결과 코드베이스가 훨씬 더 읽기 쉽고 사용하기 쉽다고 생각합니다. (예, 템플릿을 작성한 것은 템플릿 함수에서의 간단한 연습입니다. 불행히도 제가 작업 결과물의 일부로 작성했기 때문에 여기에서 코드를 재현하지 못할 수도 있습니다.) –

+2

나는 그 유용성에 대해 논쟁하지 않습니다. 부스트는 어쨌든'lexical_cast'를 이미 가지고 있습니다. 너의 대답이 여기에 속하지 않는다고 말하는 것 뿐이야. 어쩌면 그것은 블로그에 속해 있거나 유형을 변환하는 세 번째 방법을 묻는 질문에 대한 답변으로,이 답변이 완전히 무시한 다른 두 가지 비교를위한 것일 수 있습니다. –

1

strtol()은 std :: invalid_argument를 유효하지 않은 입력에서 throw하기 때문에 strtol()보다 sti()를 선호합니다. GNU의 예외 메시지 libstdC++는 도움이되지 않습니다. 예 : "what() : stoi"

관련 문제