首页 > 编程语言 >C++ Standard Library

C++ Standard Library

时间:2024-04-22 22:35:06浏览次数:25  
标签:容器 STL vi c++ Standard Library C++ include

C++ Standard Library

architecure & sources

c++官网

C标准库 -> 一个一个单一的函数function -> 彼此几乎无关联

c++标准库 -> 六个部分 -> 彼此之间有紧密的关联

c++标准库主要是用模板做出来的

泛型编程(Generic Programming)

使用模板作为主要工具来编写程序 -> templates模板的意义和运用

与面向对象编程(oop -> Object Oriented Programming)的根本差异

  • level 0: 使用c++STL

  • level 1: 认识c++STL -> 使用部件的时候

    • 清楚他们在内存当中的布局.以及如何扩展的

    • 当元素增加的时候如何变化的

    • 进而判断用什么部件、容器、算法

  • level 2: 良好使用c++STL -> 对c++STL有一个清楚的认识和了解之后才能够做到良好的使用

  • level 3: 扩充c++STL -> 极少数

c++ Standard Library && c++ Standard Template Library

c++ Standard Library

  • headr files的形式出现 -> 不是编译好的,可以看到source code

    • c++标准库头文件不带.h名 -> #include <vector>

c++STL是指六大部件.加上其他的东西才是c++标准库

c++引用文档

在头文件内在进行一层封装就是namespace -> 头文件内又打了一个包

c++STL

STL六大部件(components)

  • 容器(Containers) -> 解决掉内存分配的问题 -> template class -> 数据在容器里面 -> 每一种容器对应一个头文件

  • 分配器(Allocators) -> 支持容器解决内存的问题

  • 算法(Algorithms) -> 容器下的模板函数 -> 不在容器的class里面 -> 模板编程

  • 迭代器(Iterators) -> 数据和算法(操作方式)中间的桥梁称之为迭代器 -> 泛化的指针

  • 适配器(Adapters) -> 转换容器、迭代器或者转换仿函数

  • 仿函数(Functors) -> 两个类或者class进行计算就可以写一些仿函数

数据结构+算法=程序

面向对象(oop) -> 数据和处理数据的函数都放在class里面

上述STL使用示例代码:

#include <vector>
#include <algorithm>
#include <functional>
#include <iostream>

using namespace std;

int main()
{
   int ia[6] = { 27, 210, 12, 47, 109, 83 };

   vector<int, allocator<int>> vi(ia, ia+6);
   /**
    * vector是容器 -> Container
    * 第一个int是指名容器放置的是int类似数据
    * 第二个参数是有一个默认的分配器 -> 可以手动指定 -> 帮助容器分配内存
    * (分配器基本上不需要使用者去理会)
    * allocator是分配器 -> Allocator
   */

  cout << count_if(vi.begin(), vi.end(), not1(bind2nd(less<int>(), 40)));
  /**
   * count_if()是一个算法 -> Algorithm
   * vi.end()里面的vi是一个迭代器(不是理解上的对象 -> 通过对象调用里面的方法 -> 因为vi是一个容器)
   * 所以这里的vi是迭代器.容器和算法的桥梁 -> Iterator
   * not1()是一个仿函数适配器
   * bind2nd()也是一个仿函数适配器
   * less<int>、bind2nd和not1需要去看stl里面的定义他们是什么以及怎么使用
  */
}

容器特点

  • 容器不一定是连续空间

  • begin()指向第一个元素.end()指向最后一个元素的下一个元素 -> 前闭后开区间 -> 所以end()不可以解引用拿地址.因为拿不到想要的地址

  • 上面两个方法返回的是泛化指针

示例代码:

#include <vector>
#include <iostream>

using namespace std;

int main()
{
   vector<double> vi;

   for (auto elem : vi) // 这样的for后面必须放置一个容器
  {
       elem *= 3; // 这样不会修改容器内的元素赋值.因为是赋值给的elem
  }

   for (auto &elem : vi)
  {
       elem *= 3; // 这样会修改容器内的值.因为拿到的是引用
  }
}

标签:容器,STL,vi,c++,Standard,Library,C++,include
From: https://www.cnblogs.com/JunkingBoy/p/18151727

相关文章

  • C++开发学习
    C++第三方库使用如何在VS中配置第三方C++库教程在程序的源文件(如.c和.cpp文件)编辑阶段,为了使用第三方库,我们一般会在编辑器中使用#include指令来包含库的头文件(.h或.hpp文件)。编写好程序的源文件后,在编译阶段,编译器会根据头文件中声明的函数、类等信息去寻找这个函数......
  • C++ 构造函数实战指南:默认构造、带参数构造、拷贝构造与移动构造
    C++构造函数构造函数是C++中一种特殊的成员函数,当创建类对象时自动调用。它用于初始化对象的状态,例如为属性分配初始值。构造函数与类同名,且没有返回值类型。构造函数类型C++支持多种类型的构造函数,用于满足不同的初始化需求:默认构造函数:不带参数的构造函数,通常用于初......
  • 【每周例题】力扣 C++ 分割字符串
    分割字符串题目 题目分析1.先确定用容器存储,容器的存储结构如下图所示: 2.这个题目的话,第一反应应该是用到动态规划,下面是动态规划的模板:res=[]ans=[]defbacktrack(未探索区域,res,path):if未探索区域满足结束条件:res.add(ans)#深度拷贝......
  • 【每周例题】力扣 C++ 最小和分割
    最小和分割题目 题目分析1.num1 和 num2 中所有数字出现的次数之和等于 num 中所有数字出现的次数。即,num1与num2是从num中提取出来的,且不会重复提取同一个数字,且提取的顺序并不需要按照num的数字顺序2.返回 num1 和 num2 可以得到的和的最小值。要想得到最小值,需......
  • C++八股之函数重载与重写-静态多态与动态多态
    重载:是指在同一作用域中允许存在多个同名函数,⽽这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。重载与类无关,重载实现编译时多态,属于静态绑定。重写:指⼦类新定义⽗类的函数的做法。如果重写的函数在父类中是虚函数,那么能够实现动态多态。如果在父类中没......
  • UE4纯C++实现游戏中快捷栏之创建快捷栏UI
    作为一个在游戏界面中显示的快捷栏,我们需要在游戏运行时就显示出快捷栏UI,故我们创建两个Widget。1.SlAiGameHUDWidget:负责游戏中界面UI的整体显示2.SlAiShortcutWidget:负责快捷栏部件的显示与逻辑然后我们通过:1.将GameHUDWidget添加进视口:在GameHUD文件中添加Game......
  • 深度解读《深度探索C++对象模型》之数据成员的存取效率分析(三)
    接下来我将持续更新“深度解读《深度探索C++对象模型》”系列,敬请期待,欢迎关注!也可以关注公众号:iShare爱分享,自动获得推文和全部的文章列表。前面两篇请通过这里查看:深度解读《深度探索C++对象模型》之数据成员的存取效率分析(一)深度解读《深度探索C++对象模型》之数据成员的......
  • C++ 上位软件通过Snap7开源库访问西门子S7-1200/S7-1500数据块的方法
    前言本人一直从事C++上位软件开发工作较多,在之前的项目中通过C++访问西门子PLCS7-200/S7-1200/S7-1500并进行数据交互的应用中一直使用的是ModbusTCP/ModbusRTU协议进行。Modbus上位开源库采用的LibModbus。经过实际应用发现Modbus开源库单次发送和接受的数据不能超......
  • C++ 连接pg数据库
    环境:windows10vs2022引入pqxxs一些增删改查的示例代码#include"pqxx/pqxx"voidinsertPg(){try{//建立连接pqxx::connectionconn("dbname=postgresuser=postgrespassword=123hostaddr=127.0.0.1port=5432");//添加数据......
  • 关于c++输入输出缓冲区,和IO加速流的一些理解
    首先,让我们来介绍一下这个函数ios::sync_with_stdio();这个函数在缺省状态下默认为true,即开启,这个函数的作用是同步c和c++的缓冲区这个操作是c++为了兼容c而做出的保守决定,即将c和c++的缓冲区合并为一个,但是这样会带来性能上的开销为什么呢?因为这个兼容缓冲区先执行c的输入输......