首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对对象使用setw

如何对对象使用setw
EN

Stack Overflow用户
提问于 2012-07-30 02:43:47
回答 2查看 1.1K关注 0票数 2

我正在尝试使用NTL库(一个数论库)来格式化输出。其中一个对象是GF2X对象,它是表示为系数字符串的多项式。一个简单的例子:

代码语言:javascript
复制
GF2X a = GF2X(5,1);
a++;
cout<<a;

将产生与x^5 + 1相同的[1 0 0 0 0 1]。我的问题是如何使用setw格式化此输出。我希望能够输出各种长度的GF2X对象,前面加上一个数字,后面加上一个字符串。我希望我的输出如下所示:

代码语言:javascript
复制
  1:    [x x x x x x x x]       string here
 15:    [x x x]                 string here

我也会满足于右对齐],如果我使用setw,这可能是我应该期望的。但是,当我使用代码时(为简单起见,省略了变量名):

代码语言:javascript
复制
    cout << setw(3)<< int <<": "<< setw(35) << GF2X << setw(15) << string << endl;

我得到的输出更像这样(为了紧凑,删除了一些空格)

代码语言:javascript
复制
  1:            [x x x x x x x x]   string here
 15:            [x x x]   string here

换句话说,setw函数似乎将<<GF2X的整个输出视为单个字符,并且实际上并没有考虑到输出字符串的大小。从我向您展示的输出中可以看到,GF2X输出的左侧是对齐的,但右侧没有对齐,而通常情况下,setw似乎会对齐输出的右侧。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-30 03:17:06

您可以通过修改输出操作符来完成此操作。我想它是这样写的(我对这个GF2X类一无所知,所以这部分是伪代码:

代码语言:javascript
复制
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在这里会给你带来很大的方便,因为它会为你做最后一件事:

代码语言:javascript
复制
cout << setw(35) << boost::lexical_cast<std::string>(GF2X);
票数 2
EN

Stack Overflow用户

发布于 2012-07-30 03:29:12

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

代码语言:javascript
复制
    ostringstream oss;
    oss << GF2X;
    cout << setw(3) << x << ": "<< setw(35) << oss.str() << setw(15) << string <<endl;

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11711931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档