• <C++>初识STL —— 标准模板库


    引言

            前面的函数模板和类模板都是为了STL的理解做准备的,因此终于迎来了C++提高编程的重点:STL。快来跟博主一起了解标准模板库的基本知识和使用吧!

    ✨✨订阅专栏学习不迷路哦~✨✨

    目录

    STL的出现背景

    STL基本概念

    STL六大组件

    初识容器算法迭代器

    vector容器的初次使用

    存放内置数据类型

    存放自定义数据类型

    vector容器的嵌套使用

     运行效果

    ✨总结 


    STL的出现背景

    • 长久以来,软件届就一直希望建立一种可重复利用的东西
    • C++的面向对象和泛型编程思想,目的就是复用性的提升
    • 数据结构和算法没能有一套标准,导致被迫从事大量重复工作
    • 为了建立数据结构和算法的一套标准,那么STL就诞生了

    STL基本概念

    • STL全称:标准模板库(Standard Template Library)
    • STL从广义上分为:容器(container)算法(algorithm)迭代器(iterator)
    • 容器和算法之间通过迭代器进行无缝连接
    • STL几乎所有的代码都采用了模板类或者模板函数

    STL六大组件

    • STL六大组件分别是:容器、算法、迭代器、仿函数、适配器、空间配置器。

    • 容器:各种数据结构,如vector、list、deque、set、map等,用来存放数据。

    • 算法:常用的各种算法,如sort、find、copy、for_each等

    • 迭代器:扮演了容器与算法之间的粘合剂,迭代器的使用非常类似于指针,初学阶段我们可以先理解迭代器为指针。

    • 仿函数:行为类似函数,可作为算法的某种策略

    • 适配器:一种用来修饰容器或者仿函数或迭代器结构的东西。

    • 空间配置器:负责空间的配置与管理。

    初识容器算法迭代器

    迭代器种类:

             常用的迭代器种类为双向迭代器,和随机访问迭代器。

    了解STL容器、算法、迭代器概念之后,我们利用代码感受STL的魅力

    STL中最常用的容器为vector,可以理解为数组,下面我们将学习如何向这个容器中插入数据、并遍历这个容器。

    vector容器的初次使用

    容器:    vector

    算法:    for_each

    迭代器:vector::iterator

    存放内置数据类型

    1. void printInfo(int val) {
    2. cout << val<<" ";
    3. }
    4. //内置数据类型存放测试
    5. void test02()
    6. {
    7. vector<int> ve;
    8. ve.push_back(1);
    9. ve.push_back(0);
    10. ve.push_back(0);
    11. ve.push_back(8);
    12. ve.push_back(6);
    13. cout << "此时容器大小为:" << ve.size() << endl;
    14. cout << "容器数据情况:" << endl;
    15. //通过迭代器来访问容器中的数据 3种方法
    16. //1、while循环遍历
    17. //vector::iterator itBegin = ve.begin();//起始迭代器,指向容器中第一个元素
    18. //vector::iterator itEnd = ve.end();//结束迭代器,指向容器中最后一个元素的下一个位置
    19. /*while (itBegin != itEnd)
    20. {
    21. cout << *itBegin <<" ";
    22. itBegin++;
    23. }*/
    24. //2、for循环遍历
    25. /*for (vector::iterator it = ve.begin(); it != ve.end(); it++)
    26. {
    27. cout << *it << " ";
    28. }*/
    29. //3、for_each遍历
    30. for_each(ve.begin(),ve.end(),printInfo);
    31. cout << endl;
    32. }

    首先创建整型的vector容器 ve,将1、0、0、8、6依次尾插入ve容器内,然后利用迭代器来访问容器中的数据,分为while、for、for_each三种循环方法:

    1、while循环

            创建两个指针itBegin、itEnd分别指向ve容器的第一个位置和最后一个元素的下一个位置,利用while循环,当递增的itBegin不等于itEnd时,输出解引用的itBegin,就可以得到该位置对应的数据,递增的语句是itBegin++

    2、for循环

            创建一个指针即可,也是让指针从begin递增,在不等于end时依次解引用输出数据。这个方法比较方法,我个人推荐使用

    3、for_each循环

            使用for_each循环需要先引入头文件#include,这个头文件包含了算法里的方法。参数列表分别是:起始位置,终止位置,打印函数。所以我定义了一个printInfo函数来不换行打印数据。

    存放自定义数据类型

    1. //Person类展示
    2. class Person
    3. {
    4. public:
    5. string name;
    6. int height;
    7. Person(string name, int height) {
    8. this->name = name;
    9. this->height = height;
    10. }
    11. };
    12. //自定义类型数据存放测试
    13. void test01()
    14. {
    15. Person p1("子鼠",120);
    16. Person p2("丑牛",150);
    17. Person p3("寅虎",140);
    18. vector v;
    19. v.push_back(p1);
    20. v.push_back(p2);
    21. v.push_back(p3);
    22. for (vector::iterator it = v.begin(); it != v.end(); it++)
    23. {
    24. cout << "姓名:" << it->name << " 身高:" << it->height << endl;
    25. }
    26. }

            vector通过参数列表里的数据类型来决定容器内存放的数据类型,这里参数列表指定时Person类,那么就可以将创建的对象p1、p2、p3存入容器内,再利用for循环打印数据。和上面不同的是,打印姓名身高用的是->操作符,这是因为it相当于一个指针,所以可以直接通过指针调用对象的属性,当然也可以这样写:(*t).name,先解引用再调用的方式也可以。

    vector容器的嵌套使用

            容器相当于一个数组,那么数组嵌套数组不就是二维数组吗,我们来测试一下。

    1. //打印嵌套容器的数据
    2. void printVector(vectorint>>V)
    3. {
    4. cout << "打印嵌套容器数据:" << endl;
    5. for (vectorint>>::iterator T = V.begin(); T != V.end(); T++)
    6. {
    7. for (vector<int>::iterator t = (*T).begin(); t != (*T).end(); t++)
    8. {
    9. cout << *t << " ";
    10. }
    11. cout << endl;
    12. }
    13. }
    14. //容器嵌套使用,二维数组
    15. void test03()
    16. {
    17. vectorint>> V;
    18. vector<int>v1;
    19. vector<int>v2;
    20. vector<int>v3;
    21. vector<int>v4;
    22. vector<int>v5;
    23. for (int i = 1; i < 5; i++)
    24. {
    25. v1.push_back(i);
    26. v2.push_back(i+1);
    27. v3.push_back(i+2);
    28. v4.push_back(i+3);
    29. v5.push_back(i+4);
    30. }
    31. V.push_back(v1);
    32. V.push_back(v2);
    33. V.push_back(v3);
    34. V.push_back(v4);
    35. V.push_back(v5);
    36. printVector(V);
    37. }

            创建的这个V容器,他的参数列表是vector,那就说明该容器存入的是存入整型数据的容器,说白了就是二维整型数组。然后先创建小容器并进行赋值,再将小容器尾插入大容器内,调用自定义的printVector函数来打印数据。

            二维数组都是两层for循环打印,类似的对于嵌套容器来说也一样。  第一层for循环决定着循环的次数,第二层for循环的(*T)用到了二级指针,也就是说大容器T指针解引用之后还是一个小容器的指针,根据T++这行代码来更新指向也就能改变小指针的容器,从而输出嵌套容器内的所有数据。

     运行效果

    总结 

            那么到这里初识STL就结束了,跟着这篇博客学习可以了解STL的基本概念,以及STL六大组件中容器、算法、迭代器的关系。后面的内容也会持续更新的,希望朋友们多多支持,你们的鼓励是我创作的不竭动力!

  • 相关阅读:
    Git --》如何玩转Gitee?
    掘光者网课题库接口
    ChatGPT原理简介
    2021年中国研究生数学建模竞赛B题——空气质量预报二次建模
    【全开源】二手车置换平台系统小程序(FastAdmin+ThinkPHP+Uniapp)
    详解:API开发【电商API封装商品数据SKU接口的开发接入】
    基于微信小程序的学生购电系统设计与实现-计算机毕业设计源码+LW文档
    微服务框架 SpringCloud微服务架构 5 Nacos 5.3 服务多级存储模型
    详解memcpy和memmove函数的使用
    Win10+Ubuntu20.04双系统双硬盘(SSD+HDD)安装与启动
  • 原文地址:https://blog.csdn.net/m0_58618795/article/details/125611657