[c++] istringstream, ostringstream 및 stringstream의 차이점은 무엇입니까? / 모든 경우에 stringstream을 사용하지 않는 이유는 무엇입니까?

내가 사용하는 것이 때 std::istringstream, std::ostringstream그리고 std::stringstream난 그냥 사용하지 말아야하는 이유 std::stringstream모든 시나리오에서 (모든 런타임 성능 문제가 있습니까?).

마지막으로 스트림을 전혀 사용하지 않고 이에 대해 나쁜 점이 있습니까?

std::string stHehe("Hello ");

stHehe += "stackoverflow.com";
stHehe += "!";



답변

개인적으로, 동일한 문자열 스트림에 스트리밍을 수행하려는 경우는 매우 드 find니다.

일반적으로 문자열에서 스트림을 초기화 한 다음 구문 분석하고 싶습니다. 또는 문자열 스트림으로 사물을 스트리밍 한 다음 결과를 추출하여 저장합니다.

동일한 스트림으로 스트리밍하는 경우 스트림 상태 및 스트림 위치에 매우주의해야합니다.

‘그냥’을 사용 istringstream하거나 ostringstream의도를 더 잘 표현하면 실수로 <<vs를 사용하는 등의 어리석은 실수를 검사 할 수 있습니다 >>.

약간의 성능 향상 이 있을 수 있지만 먼저 보지 않을 것입니다.

당신이 쓴 것에 아무런 문제가 없습니다. 성능이 충분하지 않다면 다른 접근법을 프로파일 링하거나 그렇지 않은 경우 가장 명확한 것을 고수 할 수 있습니다. 개인적으로, 나는 단지 갈 것입니다 :

std::string stHehe( "Hello stackoverflow.com!" );


답변

A stringstream는 다소 크고 성능이 약간 떨어질 수 있습니다. 다중 상속은 vtable 포인터를 조정해야 할 수 있습니다. 가장 큰 차이점은 (적어도 이론적으로는) 의도를 더 잘 표현하고 의도 한 >>위치 <<(또는 그 반대) 를 실수로 사용하지 못하게하는 것입니다 . OTOH, 그 차이는 특히 시연 코드의 빠른 비트에 대해 충분히 작기 때문에 게으르고 사용 stringstream합니다. 꽤 실수로 마지막으로 사용한 시간이 기억이 안나요 <<내가 의도 한 때를 >>(당신이 경우 특히 이후 그래서 나에게 안전의 비트가 주로 이론적 인 것, 어떻게 그런 실수를, 그것은 거의 항상있을거야 정말 거의 즉시 명백한).

원하는 것을 달성하는 한 문자열을 사용하는 것이 전혀 잘못이 아닙니다. 문자열을 합치면 쉽고 편리합니다. 그래도 다른 종류의 데이터를 포맷하려면 a stringstream가 지원하고 문자열은 대부분 지원하지 않습니다.


답변

대부분의 경우 동일한 문자열 스트림에서 입력과 출력이 모두 필요하지 않으므로 사용 std::ostringstream하고 std::istringstream명시 적으로 의도를 명확하게합니다. 또한 실수로 잘못된 연산자 ( <<vs >>)를 입력하지 못하게합니다 .

동일한 스트림에서 두 작업을 모두 수행해야 할 경우 분명히 범용 버전을 사용합니다.

성능 문제는 여기서 가장 걱정거리가 될 것입니다. 명확성이 주요 이점입니다.

마지막으로 순수한 문자열을 구성해야하므로 문자열 추가를 사용하는 데 아무런 문제가 없습니다. 펄과 같은 언어로 가능한 숫자를 결합하는 데 사용할 수는 없습니다.


답변

istringstream은 입력 용이며 ostringstream은 출력용입니다. stringstream이 입력 및 출력됩니다. 거의 모든 곳에서 stringstream을 사용할 수 있습니다. 그러나 객체를 다른 사용자에게 제공하고 연산자 >>를 사용하는 반면 쓰기 전용 객체를 기다리는 곳에서는 행복하지 않습니다 😉

추신 : 그것에 대해 나쁘지 않고 성능 문제 만 있습니다.


답변

세 번째 질문에 대답하기 위해 : 아니오, 그것은 완벽하게 합리적입니다. 스트림 사용의 장점은 operator<<정의 된 모든 종류의 값을 입력 할 수 있고 문자열 (C ++ 또는 C) 만에 추가 할 수 있다는 것 std::string입니다.


답변

삽입 또는 추출 만 작업에 적합한 경우 ‘i’또는 ‘o’접두사 버전 중 하나를 사용하여 원하지 않는 작업을 제외 할 수 있습니다.

중요하지 않은 경우 i / o 버전을 사용할 수 있습니다.

표시하는 문자열 연결은 완벽하게 유효합니다. 문자열 스트림을 사용하여 연결할 수 있지만 문자열 스트림의 가장 유용한 기능은 아니지만 POD 및 추상 데이터 유형을 삽입하고 추출 할 수 있습니다.


답변

std :: ostringstream :: str ()은 스트림 내용의 사본을 작성하여 일부 상황에서 메모리 사용량을 두 배로 늘립니다. 이것을 피하기 위해 std :: stringstream 및 rdbuf () 함수를 대신 사용할 수 있습니다.

자세한 내용은 여기 : ostringstream을 cout에 직접 쓰는 방법