文章目录
I/O库
一、IO类
- IO对象无拷贝或赋值,甚至不能显式构造初始化
二、输出缓存
1.矛盾
CPU和IO设备的速度之间的矛盾,就决定我们不能把每一次IO操作都单独执行,所以系统会把多个IO操作组合成一个系统级操作,从而带来性能上的优化,而这些单个操作的数据就被放在缓冲区(缓冲区分为输入缓冲区和输出缓冲区)中,等CPU需要时再从缓冲区中获取。
带来的好处:
- 合并多次IO操作为一个系统级操作,有利于性能提升
- IO设备与缓冲区交互时,CPU可以运行其他进程
2.缓冲刷新的原因(写入到文件或设备)
- 程序结束,return,缓冲刷新被执行(所以程序结束,cout的数据会出现在显示器上)
- 缓冲区满
- endl,flush,ends显示刷新
- unitbuf设置流的内部状态,清空缓冲区,cerr默认设置unitbuf
cout << unitbuf << "hello world!" << endl;
- 关联输入输出流(x.tie(&o))——任何试图从输入流读取数据的操作都会先刷新关联的输出流
cin.tie(&cout);
顺序容器
一、迭代器
- 迭代器是一个公共接口,用于访问和遍历对应的容器
- forward_list迭代器不支持递减运算符(–),因为它是单向链表
二、细节
- forward_list有自己的insert和emplace,而没有push_back和emplace_back,原因是forward_list是单向链表,只记录头节点,插入到表尾时间复杂度O(n),而list是双向链表,记录表尾,插入到表尾仅需O(1)
- forward_list和list的迭代器不能相减,因为它们的内存分配不是连续的
forward_list<int> vec{
1, 2, 3};
cout << distance(vec.begin(), vec.end()) << endl;
- vector和string不支持push_front和emplace_front,同理插入O(n)
- emplace_back和push_back的区别:
emplace_back会在容器管理的内存空间直接创建对象,而调用push_back则会通过构造函数创建一个局部临时变量,并调用拷贝构造函数将拷贝的对象压入容器,再释放临时变量
代码来源
#include <iostream>
#include <vector>
#include<string>
using namespace std;
class CText
{
private:
string str;
public:
CText(string s) : str(s)
{
}
void show() const
{
cout << str << endl;
}
};
int main()
{
vector<CText> vi;
vi.empla