2012-07-29 5 views
2

NTL 라이브러리 (숫자 이론 라이브러리)를 사용하여 출력을 포맷하려고합니다. 객체 중 하나는 GF2X 객체입니다.이 객체는 계수 열로 표현되는 다항식입니다. 빠른 예 :객체와 함께 setw를 사용하는 방법

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

은 X^5 + 1 질문은 setw 사용이 출력 포맷에 관한 것과 동일하다하는 [1 0 0 0 0 1]을 수득한다. 다양한 길이의 GF2X 객체를 출력 할 수 있기를 원합니다. 숫자 앞에는 문자열이 추가됩니다. 나는 다음과 같이 내 출력을 싶습니다

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

나는 또한 올바른 정착 것] 내가 setw 사용하고 있다면 아마 기대한다 무엇을 정렬 할 수 있습니다. 내가 코드 (편의상 ommitted 변수 이름)를 사용할 때, :

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는 출력의 오른쪽을 정렬하는 것처럼 보입니다.

+0

하나의 접근법은 GF2X – nims

+0

@nims의 << 연산자에 과부하가 될 수 있습니다. 그는이를 수행 한 것으로 보입니다. io manipulators는 자신의 직업에 적합하지 않습니다. 필자는 객체를 문자열로 포맷하고 스트림에 전달하고 객체를 생성하는 함수 인 사용자 정의 클래스를 사용하는 것을 선호합니다. 'cout << FormatWidth (35, GF2X);' –

+0

'std :: left'를 전달하려고 했습니까? – jrok

답변

2

출력 연산자를 수정하면됩니다. 그것을

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는 '['첫 번째에서 작동하는 것입니다 : 나는이 GF2X 클래스에 대해 아무것도 몰라 (그것을 이런 식으로 뭔가를 작성 상상, 그래서 이것은 부분적으로 사이비 - 코드 전체 객체에 대해 작동하지 않습니다 (전체 객체가 무엇인지 알지 못합니다.) 문자열 전체에 문자열을 쓰거나 (다른 방법을 사용하여) 연산자를 고칠 수 있습니다. 다음에 문자열을 출력합니다. 만약 연산자를 수정하는 것이 옵션이 아니라면 별도의 도우미 함수를 사용하여 먼저 객체를 문자열로 변환 한 다음 (문자열 스트림을 사용하여) 문자열을 스트림으로 출력해야합니다.

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

나는 당신이 이미 이것을 생각했다는 최근 코멘트를 보았습니다. –

+0

예, 불행하게도 실제로 GF2X 클래스의 각 요소에 액세스하는 멤버 함수가 없습니다. 그러나 임시 ostringstream 버퍼를 사용하는 해결 방법이 효과가있었습니다. 내가 찾은 해결책으로 내 자신의 질문에 대답하는 것이 현명 할 것인가? 아니면이 질문을 끝내야합니까? – Teofrostus

+0

@Teofrostus : 질문에 답하십시오. –

0

당신은 출력을 길게 누른 다음 제공되는 문자열에 setw 사용하는 임시 ostringstream 개체를 사용할 수 있습니다 (: 당신을 위해 마지막을 할 것이기 때문에사실, boost::lexical_cast, 여기 당신을 위해 정말 유용하게 사용할 것 변수 이름 생략).

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

이렇게하면 첫 번째 문자가 아닌 전체 ostream 객체가 포맷되고 올바른 출력이 제공됩니다.

관련 문제