IT TIP

stringstream 재설정

itqueen 2020. 10. 16. 19:19
반응형

stringstream 재설정


stringstream의 상태를 내가 만들었을 때의 상태로 "재설정"하려면 어떻게합니까?

int firstValue = 1;
int secondValue = 2;

std::wstringstream ss;

ss << "Hello: " << firstValue;

std::wstring firstText(ss.str());

//print the value of firstText here


//How do I "reset" the stringstream here?
//I would like it behave as if I had created
// stringstream ss2 and used it below.


ss << "Bye: " << secondValue;

std::wstring secondText(ss.str());

//print the value of secondText here

이것은 내가 일반적으로하는 방법입니다.

ss.str("");
ss.clear(); // Clear state flags.

난 그럴거야

std::wstringstream temp;
ss.swap(temp);

편집 : christianparpart 및 Nemo가보고 한 오류를 수정했습니다. 감사.

추신 : 위의 코드는 스택에 새로운 stringstream 객체를 생성하고 모든 것을 새로운 객체의 객체로 교체 ss합니다.

장점 :

  1. ss이제 새로운 상태가 보장 됩니다.
  2. 새 개체는 인라인 및 스택에 생성되므로 컴파일러가 코드를 쉽게 최적화 할 수 있습니다. 결국 모든 ss내부 데이터를 초기 상태로 재설정하는 것과 같습니다 .

더:

  1. 할당 연산자와 비교 : STL 스왑 메서드는 새 개체의 힙에 할당 된 버퍼가있는 경우 할당 연산자보다 빠를 수 있습니다. 이러한 경우 할당 연산자는 새 개체에 대한 버퍼를 할당해야하며, 이전 개체에 대해 다른 버퍼를 할당 한 다음 새 개체의 버퍼에서 이전 개체의 새 버퍼로 데이터를 복사해야 할 수 있습니다. 예를 들어 버퍼의 포인터 만 바꾸는 빠른 스왑을 구현하는 것은 매우 쉽습니다.

  2. C ++ 11. 스왑보다 느린 이동 할당 연산자의 일부 구현을 보았지만 수정할 수는 있지만 아마도 STL 개발자는 많은 데이터가있는 이동 된 개체를 남기고 싶지 않을 것입니다.

  3. std::move()이동 된 개체가 비워지는 것을 보장하지 않습니다. return std::move(m_container);m_container를 지우지 않습니다. 그래서 당신은해야 할 것입니다

    자동 to_return (std :: move (m_container)); m_container.clear (); return to_return;

어느 것이 더 나을 수 없습니다

auto to_return;
m_container.swap(to_return);
return to_return;

후자는 버퍼를 복사하지 않도록 보장하기 때문입니다.

그래서 나는 항상 swap()그것이 맞는 한 선호합니다 .


위의 답변을 바탕으로 서식을 재설정해야합니다. 우리는 모두 새로운 std :: stringstream 인스턴스가 생성 될 때 버퍼 내용, 스트림 상태 플래그 및 모든 형식을 기본값으로 재설정합니다.

void reset(std::strinstream& stream)
{
    const static std::stringstream initial;

    stream.str(std::string());
    stream.clear();
    stream.copyfmt(initial);
}

참고 URL : https://stackoverflow.com/questions/7623650/resetting-a-stringstream

반응형