相关疑难解决方法(0)

将vector <int>转换为string

在C++中,将int(即vector<int>)向量转换为字符串的最简单方法是什么?

c++ string vector

41
推荐指数
3
解决办法
11万
查看次数

在C++输出流中设置宽度

我试图通过设置不同字段的宽度在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)

问题是,这两种选择都不允许我设置默认的最小宽度,每次我都要向流写入内容时我必须更改它.

有没有人知道我可以做到这一点而无需无数次重复同一次呼叫?提前致谢.

c++ width

18
推荐指数
1
解决办法
3万
查看次数

与setw()有什么关系?

我最近被这样的事实所困扰: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不是.

c++ setw c++-standard-library

16
推荐指数
2
解决办法
4357
查看次数

有效使用C++ iomanip库

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,setwsetprecision语句),这样你就会这样说:"这个给定的格式打印以标准方式中的字符,但数字".

谢谢!

编辑

根据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)

c++ iostream stream iomanip

7
推荐指数
1
解决办法
3282
查看次数

标签 统计

c++ ×4

c++-standard-library ×1

iomanip ×1

iostream ×1

setw ×1

stream ×1

string ×1

vector ×1

width ×1