H_On个人小站

个人站

这都被你发现了【惊
奖励你一朵小红花~


StandardTemplateLibrary 3

  • 对于 STL 完全不理解的可以先看看基础篇:StandardTemplateLibrary
  • 这里还有一些关于 getlinesscanfstringstream,控制小数输出,二元组,高级 for 循环的内容请看:STL 进阶

目录

简介

STL Standard Template Library - 标准模板库又称 C++ 泛型库,它在 std 命名空间中定义了常用的数据结构和算法,大大增加了我们编写算法的效率,使我们在摸索/学习算法或者解决问题时能够通过各种各样的容器来构造简单便利的数据结构。

最近在工作中发现了一些 C++ 的新东西,感觉还是蛮有用的,由此写下 STL3 来记录。 那么接下来继续由猹来为大家介绍 STL 的其他用法。

<iomanip> 套件

引入库 <iomanip> 来使用:

输出数据占位宽度,小数位数

setw() 输出流控制语句。setw() 必须要在每个输出的数据前面都放一个,也就是说哪个前面跟着一个 setw() 哪个就限制输出位数,不放就不限制。

setiosflags() 是只需要在一段输出流中放入一次,后面的就都会设定相同的变化。数据默认是右对齐,使用 setiosflags(ios::left) 来使其左对齐。

#include <iostream>
#include <iomanip>

using namespace std;

int main() {
    int i = 0, j = 12;
    double pi = 13.14159265359;
    cout << pi << endl;
    cout << fixed << setprecision(2) << pi << endl;
    cout << setiosflags(ios::fixed) << setprecision(3) << pi << endl;
    cout << setw(12) << pi << "|" << endl;
    cout << setiosflags(ios::left) << setw(12) << pi << "|" << endl;
    cout << setw(6) << setprecision(2) << pi << "|" << endl;
    cout << pi << '|' << endl;
    cout << setfill('-') << setw(12) << pi << "|" << endl;
    cout << setiosflags(ios::internal) << setw(12) << pi << "|" << endl;
    return 0;
}

运行结果:

13.1416
13.14
13.142
      13.142|
13.142      |
13.14 |
13.14|
13.14-------|
-------13.14|

总结:

  • fixedsetiosflags(ios::fixed) 效果一样,且往后的输出流全部有效。
  • setprecision() 对输出浮点数的限制,设置后持续有效。
  • setiosflags(ios::left) 的效果往后全部有效。
  • setw() 只对后面的一个数据有效。
  • setfill() 配合 setw() 使用,设置填充空白处的字符,默认是空格,设置后保持有效。

单独设置

#include <iostream>
#include <iomanip>

using namespace std;

int main() {
    double a = 0.00001;
    cout << a << endl;
    cout.setf(ios::fixed,ios::floatfield);
    cout << '|' << a << '|' << endl;
    cout.precision(7);
    cout << '|' << a << '|' << endl;
    cout << setw(10) << '|' << a << '|' << endl;
    cout << '|' << setw(10) << a << '|' << endl;
    return 0;
}

运行结果:

1e-05
|0.000010|
|0.0000100|
         |0.0000100|
| 0.0000100|

总结:

  • 使用 cout.setf(ios::fixed,ios::floatfield) 设置小数不试用科学计数法输出。
  • cout.precision(7)cout << setprecision(7) 功能相同。
  • 可以把影响全局的输出流控制单独放在输出流前面。

改变整型输出时的进制数

#include <iostream>
#include <iomanip>

using namespace std;

int main() {
    cout << setbase(16) << 23333 << endl;
    cout << setbase(8) << 23333 << endl;
    cout << setbase(2) << 23333 << endl;
    cout << setbase(10) << 23333 << endl;
    cout << setbase(6) << 23333 << endl;
    cout << setbase(10) << 0xfe << endl;
    cout << setbase(10) << 0b0010110 << endl;
    return 0;
}

运行结果:

5b25
55445
23333
23333
23333
254
22

总结:

  • 只能转 816,其他的进制数会原样输出。
  • 10 进制可以转换其他进制。

字符串和整数快速转换

C++ 内置了一些字符串和基础变量之间的转换:

简单示例:

#include <iostream>

using namespace std;

int main() {
    int i = -233;
        string s = to_string(i);
        int ii = stoi(s);
        double d = -3.1415;
        string sd = to_string(d);
        double dd = stod(sd);
        string ss = "33414";
        int is = stoi(ss);
        cout << i << ", ";
        cout << s << ", ";
        cout << ii << ", ";
        cout << d << ", ";
        cout << sd << ", ";
        cout << dd << ", ";
        cout << ss << ", ";
        cout << is << ", ";
    return 0;
}

运行结果:

-233, -233, -233, -3.1415, -3.141500, -3.1415, 33414, 33414,

更多函数:

函数名 作用 注意
to_string() 将基本类型的值转换为字符串 特殊地,char 类型的转换是转换成它的 ASCII 值,而不是字符。
to_string('A') = "65"
stoi() 将字符串转换为 int 型 字符串转回整型注意不要超出整型范围。
识别的时候左到右,遇到非法符自动停止,非法符号即非数字和前置正负号,如:100b345,转换为 100-100-345 转换为 -100,超出整型会抛出异常。
stoi(s, 0, 2) 将只有 0/1 组成的字符串转换为二进制对应的整数 第一个参数为字符串,只能识别前导正负号和字符 '0' or '1',超出整形范围会报错(31 位)
stoi(const string& __str, size_t* __idx = 0, int __base = 10)
后面两个参数内容固定,第二个参数不知道怎么修改,第三个就是进制数,支持 2~36 进制,这个范围之外的进制只会返回 0
atoi() stoi() 作用一样,区别是 stoi() 处理的是 string 类型,atoi() 处理的是 const char* 类型,而且超过整型范围不会抛出异常  
stol() 将字符串转为 long 类型  
stoll() 将字符串转为 long long 类型  
stof() 将字符串转为 float 类型  
stod() 将字符串转为 double 类型  
stold() 将字符串转为 long double 类型  

闲言

本篇介绍的一些函数和方法以及操作,不能说很难,只能说是记录了我最近新学到的而且感觉特别好用的一些操作,C++ 一定还有很多其他的方法,但是对于我们来说好不好用,是不是是真的很常用就不一定了,以后如果有新的进步猹还会更新的。(梅开二度)

顺便有些东西到底算不算是 STL 的范畴呢,说实话我也不知道,只是真的好用,真的有用,我就一并介绍了,如果有错欢迎指正,期待与各位大佬交流交流。