문제

NTL 라이브러리(정수론 라이브러리)를 사용하여 출력 형식을 지정하려고 합니다.객체 중 하나는 계수의 문자열로 표현되는 다항식인 GF2X 객체입니다.간단한 예:

GF2X a = GF2X(5,1);
a++;
cout<<a;

양보할 것이다 [1 0 0 0 0 1] 이는 x^5 + 1과 같습니다.내 질문은 setw를 사용하여 이 출력의 형식을 지정하는 것에 관한 것입니다.숫자 앞에 문자열을 추가하여 다양한 길이의 GF2X 개체를 출력할 수 있기를 원합니다.내 출력은 다음과 같습니다.

  1:    [x x x x x x x x]       string here
 15:    [x x x]                 string here

나는 또한 right ] 정렬에 만족할 것입니다. 이는 내가 setw를 사용하는 경우 아마도 예상해야 할 것입니다.그러나 코드를 사용할 때(단순화를 위해 변수 이름은 생략됨):

    cout << setw(3)<< int <<": "<< setw(35) << GF2X << setw(15) << string << endl;

나는 이와 같은 출력을 얻습니다 (간결함을 위해 일부 공백이 제거되었습니다)

  1:            [x x x x x x x x]   string here
 15:            [x x x]   string here

즉, setw 함수는 다음의 전체 출력을 처리하는 것 같습니다. <<GF2X 단일 문자로 표시되며 실제로 출력 문자열의 크기를 설명하지 않는 것 같습니다.제가 보여드린 출력에서 ​​볼 수 있듯이, GF2X 출력의 왼쪽은 정렬되어 있지만 오른쪽은 그렇지 않은 반면, 일반적으로 setw는 출력의 오른쪽을 정렬하는 것처럼 보입니다.

도움이 되었습니까?

해결책

출력 연산자를 수정하면 이를 수행할 수 있습니다.나는 이것이 다음과 같이 작성되었다고 상상합니다. (나는 이 GF2X 클래스에 대해 아무것도 모르므로 이것은 부분적으로 의사 코드입니다.

std::ostream & operator<<(std::ostream & os, const GF2X & x)
{
    os << '[';
    for (int i=0; i<x.num_elements; ++i)
        os << x.get_element(i) << ' ';
    return os << ']';
}

문제는 setw가 첫 번째 '['에만 작동하고 전체 객체에 대해 작동하지 않는다는 것입니다(전체 객체가 무엇인지 알 수 없음).문자열 스트림이나 다른 방법을 사용하여 전체 내용을 문자열에 작성하여 연산자를 수정할 수 있습니다. 그 다음에 문자열을 출력합니다.연산자를 수정할 수 없는 경우 별도의 도우미 함수를 사용하여 먼저 개체를 문자열(문자열 스트림 사용)로 변환한 다음 해당 문자열을 스트림으로 출력해야 합니다.

실제로, boost::lexical_cast 여기서는 정말 유용할 것입니다. 그 이유는 다음과 같습니다.

cout << setw(35) << boost::lexical_cast<std::string>(GF2X);

다른 팁

임시 ostringstream 개체를 사용하여 출력을 보관한 다음 제공된 문자열에 setw를 사용할 수 있습니다(변수 이름은 생략됨).

    ostringstream oss;
    oss << GF2X;
    cout << setw(3) << x << ": "<< setw(35) << oss.str() << setw(15) << string <<endl;

이는 첫 번째 문자가 아닌 전체 ostream 객체의 형식을 지정하고 적절한 출력을 제공합니다.

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