문제
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 객체의 형식을 지정하고 적절한 출력을 제공합니다.