c++ - 如何将 setw 与对象一起使用

标签 c++ formatting setw

我正在尝试使用 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/

相关文章:

c++ - 整数 vector vector 的统一初始化

c++ - C/C++ va_list 没有正确返回参数

java - 无需大量开销即可获得格式良好的时间戳?

java - 我可以使用哪个 API 将 int 格式化为 2 位数字?

c++ - 使用 iomanip 自动间距

c++ - 从 stringstream 中读取特定字段宽度的 int

c++ - 用函数指针初始化另一个类中的对象指针

c++ - 将 const 引用传递到构造函数链中

java - 四舍五入java的调用方法

C++ ostream 填充添加尾随 0