作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试使用 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 似乎与输出的右侧对齐。
最佳答案
您可以通过修改输出运算符来实现。我想它是这样写的(我对这个 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);
关于c++ - 如何对对象使用 setw,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11711931/
我是一名优秀的程序员,十分优秀!