2

我正在尝试使用 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 似乎对齐输出的右侧。

4

2 回答 2

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);
于 2012-07-29T19:17:05.783 回答
0

您可以使用临时 ostringstream 对象来保存输出,然后在提供的字符串上使用 setw(省略变量名)。

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

这会格式化整个 ostream 对象,而不仅仅是第一个字符,并给出正确的输出。

于 2012-07-29T19:29:12.403 回答