istringstream, ostringstream 및 stringstream의 차이점은 무엇입니까?/ 왜 모든 경우에 stringstream을 사용하지 않는 걸까요?

StackOverflow https://stackoverflow.com/questions/3292107

문제

언제 사용할까요? std::istringstream, std::ostringstream 그리고 std::stringstream 그리고 왜 그냥 사용하면 안되나요? std::stringstream 모든 시나리오에서(런타임 성능 문제가 있습니까?)

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

std::string stHehe("Hello ");

stHehe += "stackoverflow.com";
stHehe += "!";
도움이 되었습니까?

해결책

개인적으로 동일한 문자열 스트림으로 스트리밍을 수행하고 나가는 경우는 매우 드뭅니다.

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

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

'그냥'을 사용해서 istringstream 또는 ostringstream 의도를 더 잘 표현하고 우발적인 사용과 같은 어리석은 실수에 대한 점검을 제공합니다. <<>>.

거기 ~할 것 같다 약간의 성능 개선이 필요하지만 먼저 그것을 살펴보지는 않을 것입니다.

당신이 쓴 내용에는 아무런 문제가 없습니다.성능이 충분하지 않은 경우 다른 접근 방식을 프로파일링할 수 있고, 그렇지 않으면 가장 명확한 방식을 고수할 수 있습니다.개인적으로 나는 다음을 선택하고 싶습니다.

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

다른 팁

stringstream 다소 크고 성능이 약간 낮을 수 있습니다. 다중 상속을 위해서는 vtable 포인터를 조정해야 할 수 있습니다.주요 차이점은 (적어도 이론상으로는) 의도를 더 잘 표현하고 실수로 사용하는 것을 방지한다는 것입니다. >> 네가 의도한 곳 << (혹은 그 반대로도).OTOH, 특히 빠른 데모 코드 등의 경우 차이가 충분히 작아서 게으르고 그냥 사용합니다. stringstream.마지막으로 실수로 사용한 게 언제인지 기억이 나지 않습니다. << 내가 의도했을 때 >>, 그래서 나에게 그 약간의 안전은 대부분 이론적으로 보입니다(특히 만약 당신이 하다 그런 실수를 하면 거의 항상 그럴 거예요 정말 거의 즉시 명백해짐).

원하는 것을 달성하는 한 문자열을 사용하는 것에는 전혀 문제가 없습니다.문자열을 함께 연결하는 것이라면 쉽고 잘 작동합니다.하지만 다른 종류의 데이터 형식을 지정하려면 stringstream 그것을 지원하지만 문자열은 대부분 지원하지 않습니다.

대부분의 경우 동일한 문자열 스트림에서 입력과 출력이 모두 필요하지 않으므로 다음을 사용하십시오. std::ostringstream 그리고 std::istringstream 당신의 의도를 분명히 밝혀라.또한 실수로 잘못된 연산자(<<>>).

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

여기서는 성능 문제가 가장 중요하지 않으며 명확성이 가장 큰 장점입니다.

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

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

추신:나쁜 점은 없고 성능 문제만 있을 뿐입니다.

세 번째 질문에 답하려면:아니요, 그건 완전히 합리적입니다.스트림을 사용하면 어떤 종류의 값이라도 입력할 수 있다는 장점이 있습니다. operator<< 정의되지만 문자열(C++ 또는 C)만 추가할 수 있습니다. std::string.

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

이것이 중요하지 않다면 I/O 버전을 사용할 수 있습니다.

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

std::ostringstream::str()은 스트림 내용의 복사본을 생성하는데, 이는 일부 상황에서 메모리 사용량을 두 배로 늘립니다.이를 방지하려면 std::stringstream 및 해당 rdbuf() 함수를 대신 사용할 수 있습니다.

자세한 내용은 여기를 참조하세요: cout에 ostringstream을 직접 작성하는 방법

예를 들어, 읽기만 하면 된다면 읽기/쓰기 액세스를 위해 파일을 여는 이유는 무엇일까요?

동일한 파일에서 여러 프로세스를 읽어야 한다면 어떻게 될까요?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top