在C++中,将int(即vector<int>)向量转换为字符串的最简单方法是什么?
我试图通过设置不同字段的宽度在C++上创建一个整齐格式的表.我可以使用setw(n),做类似的事情
cout << setw(10) << x << setw(10) << y << endl;
Run Code Online (Sandbox Code Playgroud)
或更改ios_base :: width
cout.width (10);
cout << x;
cout.width (10);
cout << y << endl;
Run Code Online (Sandbox Code Playgroud)
问题是,这两种选择都不允许我设置默认的最小宽度,每次我都要向流写入内容时我必须更改它.
有没有人知道我可以做到这一点而无需无数次重复同一次呼叫?提前致谢.
我最近被这样的事实所困扰:ios_base::width和/或setw操纵器必须在写入流的每个项目时重置.
也就是说,你必须这样做:
while(whatever)
{
mystream << std::setw(2) << myval;
}
Run Code Online (Sandbox Code Playgroud)
而不是这个:
mystream.width(2);
while(whatever)
{
mystream << myval;
}
Run Code Online (Sandbox Code Playgroud)
好的.
但有谁知道为什么做出这个设计决定?是否有一些我缺失的理由,或者这只是标准的一个黑暗角落?
其他流格式修饰符(如链接的SO问题中所述)是"粘性",而setw不是.
我Vector用C++ 创建了一个类,它对我的问题非常有用.我现在正在清理它,我遇到了以下代码:
std::ostream& operator<<(std::ostream &output, const Vector &v){
output<<"["
<<std::setiosflags(std::ios::right | std::ios::scientific)
<<std::setw(23)
<<std::setprecision(16)
<<v._x<<", "
<<std::setiosflags(std::ios::right | std::ios::scientific)
<<std::setw(23)
<<std::setprecision(16)
<<v._y<<", "
<<std::setiosflags(std::ios::right | std::ios::scientific)
<<std::setw(23)
<<std::setprecision(16)
<<v._z<<"]";
return output;
}
Run Code Online (Sandbox Code Playgroud)
该代码允许将矢量打印为std::cout<<v<<std::endl;.每个数字有23个空格,其中16个是小数.文本右对齐,以便打印:
1.123456123456e+01
-1.123456123456e+01
Run Code Online (Sandbox Code Playgroud)
代替
1.123456123456e+01
-1.123456123456e+01
Run Code Online (Sandbox Code Playgroud)
代码似乎非常重复.你怎么能"存储"的格式(所有的setiosflags,setw和setprecision语句),这样你就会这样说:"这个给定的格式打印以标准方式中的字符,但数字".
谢谢!
编辑
根据Rob Adams的评论,我改变了我的丑陋代码(正如其他人所指出的那样,会让"下一个人"的精确度变得更加简洁(和正确)):
std::ostream& operator<<(std::ostream &output, const Vector &v){
std::ios_base::fmtflags f = output.flags(std::ios::right | std::ios::scientific);
std::streamsize p = output.precision(16);
output<<"["
<<std::setw(23)<<v._x<<", "
<<std::setw(23)<<v._y<<", "
<<std::setw(23)<<v._z
<<"]";
output.flags(f);
output.precision(p);
return output; …Run Code Online (Sandbox Code Playgroud)