C++基础总结(中)

本文介绍了C++中的I/O库,包括IO类的特性及输出缓存的工作原理,强调了缓冲区在性能优化中的作用。接着探讨了顺序容器,特别是迭代器的使用细节和容器适配器的应用。最后提到了泛式算法,如标准库算法、lambda表达式和参数绑定,并简述了关联容器和动态内存管理,特别是智能指针的使用和动态数组的构造与释放。
摘要由CSDN通过智能技术生成


I/O库


一、IO类

  • IO对象无拷贝或赋值,甚至不能显式构造初始化

二、输出缓存

1.矛盾

CPU和IO设备的速度之间的矛盾,就决定我们不能把每一次IO操作都单独执行,所以系统会把多个IO操作组合成一个系统级操作,从而带来性能上的优化,而这些单个操作的数据就被放在缓冲区(缓冲区分为输入缓冲区和输出缓冲区)中,等CPU需要时再从缓冲区中获取。
带来的好处:

  1. 合并多次IO操作为一个系统级操作,有利于性能提升
  2. IO设备与缓冲区交互时,CPU可以运行其他进程

2.缓冲刷新的原因(写入到文件或设备)

  1. 程序结束,return,缓冲刷新被执行(所以程序结束,cout的数据会出现在显示器上)
  2. 缓冲区满
  3. endl,flush,ends显示刷新
  4. unitbuf设置流的内部状态,清空缓冲区,cerr默认设置unitbuf
cout << unitbuf << "hello world!" << endl;
  1. 关联输入输出流(x.tie(&o))——任何试图从输入流读取数据的操作都会先刷新关联的输出流
cin.tie(&cout);

顺序容器


一、迭代器

  • 迭代器是一个公共接口,用于访问和遍历对应的容器
  • forward_list迭代器不支持递减运算符(–),因为它是单向链表

二、细节

  1. forward_list有自己的insert和emplace,而没有push_back和emplace_back,原因是forward_list是单向链表,只记录头节点,插入到表尾时间复杂度O(n),而list是双向链表,记录表尾,插入到表尾仅需O(1)
  2. forward_list和list的迭代器不能相减,因为它们的内存分配不是连续的
forward_list<int> vec{
   1, 2, 3};
cout << distance(vec.begin(), vec.end()) << endl;
  1. vector和string不支持push_front和emplace_front,同理插入O(n)
  2. 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值