C++STL基础

news/2024/7/3 2:30:19

STL基础

  • 诞生
    • cpp的面向对象和泛型编程的思想本质就是提高复用性
    • 诞生了STL库
  • 基本概念
    • STL标准模板库
    • STL从广义上分为容器、算法及迭代器
    • 容器和算法之间通过迭代器进行连接
    • STL几乎所有的代码都采用了模板类或者模板函数
  • 基本组件
    • 容器、算法、迭代器、仿函数、适配器、空间配置器
    • 容器
      • 各类数据结构
    • 算法
      • 各类常用算法
    • 迭代器
      • 容器和算法的胶合剂
    • 仿函数
      • 行为类似函数,可作为算法的某种策略
    • 适配器
      • 一种用来修饰容器或者迭代器接口的东西
    • 空间配置器
      • 负责空间的配置与管理
  • STL中容器、算法、迭代器
    • 容器就是运用最广泛的一些数据结构实现出来
    • 分类
      • 序列式容器
        • 强调值的排序,序列式容器中的每个元素均有固定的位置
      • 关联式容器
        • 二叉树结构,各元素之间没有严格的物理上的顺序关系
    • 算法
      • 质变算法—增删改
      • 非质变算法—查找遍历
    • 迭代器—可以初步认为是一种指针
      • 提供一种方法,使之能够依序寻访某个容器所含的各个元素
      • 每种容器都有特定的迭代器
      • 常用—双向迭代器和随机访问迭代器
  • vector
    • 存放内置数据类型
      • 容器—vector
      • 算法—for_each
      • 迭代器—vector<数据类型>::iterator
      • 简单举例
          #include<iostream>
          #include<string>
          #include<vector>
          #include<algorithm>
          using namespace std;
          //手写遍历过程
          void test1(void){
              //创建一个vector容器
              vector<int> v;
              //向容器中插入数据
              v.push_back(10);//尾插法
              v.push_back(20);
              //通过迭代器访问容器中的数据
              for(vector<int>::iterator vi = v.begin(); vi != v.end(); vi++){
                  cout << *vi << endl;
              }
          }
          //采用STL标准库
          void Myprint(int val){
              cout<< val << endl;
          }
          void test2(void){
              vector<int> v;
              v.push_back(20);
              v.push_back(21);
              for_each(v.begin(), v.end(), Myprint);
              //回调技术
          }
          int main(){
              test1();
              test2();
              return 0;
          }
      
  • 存放自定义数据类型
  #include<iostream>
  #include<string>
  #include<vector>
  #include<algorithm>
  using namespace std;
  class Person{
      public:
      Person(string name, int age){
          this->m_age = age;
          this->m_name = name;
      }
          string m_name;
          int m_age;
  };
  void test1(void){
      vector<Person*> v_p;
      Person p1("p1", 10);
      Person p2("p2", 20);
      v_p.push_back(&p1);
      v_p.push_back(&p2);
      for(vector<Person*>::iterator it= v_p.begin(); it != v_p.end(); it++){
          cout << "my name is " << (*it)->m_name << " my age is " << (*it)->m_age << endl;
      }
  }
  int main(){
      test1();
      return 0;
  }
  • 容器中嵌套容器
  #include<iostream>
  #include<string>
  #include<vector>
  #include<algorithm>
  using namespace std;
  void test1(void){
      vector<vector<int> > v;
      vector<int> v_1;
      vector<int> v_2;
      for(int i = 0; i < 3; i++){
          v_1.push_back(i+1);
          v_2.push_back(i+2);
      }
      v.push_back(v_1);
      v.push_back(v_2);
      for(vector< vector<int> >::iterator v_o = v.begin(); v_o != v.end(); v_o++){
          //*v_o---是vector<int>类型---依然是一个指针
          for(vector<int>::iterator v_i = (*v_o).begin(); v_i != (*v_o).end(); v_i++){
              cout << *v_i << endl;
          }
      }
  }
  int main(){
      test1();
      return 0;
  }

http://lihuaxi.xjx100.cn/news/955274.html

相关文章

【项目实战】MySQL中union和union all的相同点与不同点

一、union和union all的相同点 在MySQL中&#xff0c;Union和Union All都是用来合并两个或者多个查询结果集的关键字 二、union和union all的不同点 union复杂&#xff0c;union all简单 2.1 自动压缩&#xff0c;自动求并集、去重、排序操作 &#xff08;1&#xff09;unio…

《工业机器视觉检测123》(1.1) 目标检测样本类别不平衡的问题(持续更新...)

部分内容转载自&#xff1a;https://www.cnblogs.com/inchbyinch/p/12642760.html 参考分类任务中解决类别不平衡的办法&#xff1a; 1 什么是类别不平衡问题&#xff1f; 类别不平衡&#xff08;class-imbalance&#xff09;&#xff0c;也叫数据倾斜&#xff0c;数据不平衡…

【SSM】篇二:注解开发与AOP

文章目录1、注解开发1.1 注解开发定义bean1.2 纯注解开发模式1.3 注解开发Bean的作用范围和生命周期1.4 注解开发依赖注入1.5 注解开发管理第三方Bean2、Spring整合案例2.1 Spring整合mybatis2.2 Spring整合Junit3、AOP3.1 AOP思想入门案例3.2 AOP工作流程3.3 AOP切入点表达式3…

每日统计部门人员考勤打卡情况并汇总通知

在值班时&#xff0c;HR需要及时了解到部分人员的打卡情况。这个时候&#xff0c;可以通过腾讯云HiFlow来实现自动通知考勤打卡情况。实现步骤&#xff1a;Step1&#xff1a;我们进入腾讯云HiFlow官网&#xff0c;进入控制台。我们在触发应用选择【定时启动-每天】触发。这里我…

SWM181按键控制双通道PWM固定占空比输出

SWM181按键控制双通道PWM固定占空比输出&#x1f4cc;SDK固件包&#xff1a;https://www.synwit.cn/kuhanshu_amp_licheng/ &#x1f33c;开发板如下图&#xff1a; ✨注意新手谨慎选择作为入门单片机学习。目前只有一个简易的数据手册和SDK包&#xff0c;又没有参考手册&am…

如何使用固态继电器实现更高可靠性的隔离和更小的解决方案尺寸

自晶体管发明之前&#xff0c;继电器就已被用作开关。从低压信号安全控制高压系统的能力&#xff0c;如隔离电阻监控&#xff0c;对于许多汽车系统的开发是必要的。虽然机电继电器和接触器的技术多年来有所改进&#xff0c;但设计人员要实现其终身可靠性和快速开关速度以及低噪…

软考论文-成本管理(1)

成本管理 1.成本管理的主要内容&#xff1f; 规划成本&#xff1a;制定一个成本管理的计划。估算成本&#xff1a;根据项目范围说明书&#xff0c;项目管理计划和wbs等文档&#xff0c;采用xxx方法进行估算成本成本预算&#xff1a;可以算工作包的费用&#xff0c;制定预算和…

Ubuntu 18.04 LTS 和 CentOS 7 增加 Swap 空间

注意&#xff1a;随着时间的流逝&#xff0c;其中的信息可能已经有所发展或是发生改变。侵删&#xff01; 文章目录前言环境&#xff1a;使用文件划分swap 分区删除之前的swap文件&#xff08;如果有&#xff09;创建一个swap文件配置为开机自动启用swap 的使用策略前言 由于我…