我正在尝试使用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
我也愿意选择正确的对齐,如果我正在使用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似乎与输出的右侧对齐。
答案 0 :(得分:2)
您可以通过修改输出运算符来完成此操作。我想它写的是这样的(我对这个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只会在第一个'['上运行,它不会对整个对象进行操作(它不知道整个对象是什么)。您可以通过将整个事物写入字符串(使用stringstream或其他方法)来修复运算符,然后然后输出字符串。如果修改运算符不适合您,则需要使用单独的辅助函数首先将对象转换为字符串(使用字符串流),然后将该字符串输出到流中。
实际上,boost::lexical_cast
对你来说非常方便,因为它会为你做到最后:
cout << setw(35) << boost::lexical_cast<std::string>(GF2X);
答案 1 :(得分:0)
您可以使用临时的ostringstream对象来保存输出,然后在提供的字符串上使用setw(省略变量名)。
ostringstream oss;
oss << GF2X;
cout << setw(3) << x << ": "<< setw(35) << oss.str() << setw(15) << string <<endl;
这会格式化整个ostream对象,而不仅仅是第一个字符,并提供正确的输出。