STL初识

C++的面向对象和泛型编程思想,目的就是复用性的提升

为了建立数据结构和算法的一套标准,诞生了STL

STL基本概念

STL(Standard Template Library, 标准模板库)

STL从广义上分为:容器(container)算法(algorithm)迭代器(iterator)

容器 和算法 之间通过迭代器进行无缝连接

STL几乎所有的代码都采用了模板类或者模板函数

STL六大组件

STL大体分为六大组件,分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器

  1. 容器:各种数据结构,如vector、list、deque、set、map等,用来存放数据。
  2. 算法:各种常用的算法,如sort、find、copy、for_each等
  3. 迭代器:扮演了容器与算法之间的胶合剂。
  4. 仿函数:行为类似函数,可作为算法的某种策略。
  5. 适配器:一种用来修饰容器或者仿函数或迭代器接口的东西。
  6. 空间配置器:负责空间的配置与管理。

STL中容器、算法、迭代器

迭代器使用非常类似于指针,初级阶段可以先理解迭代器为指针。

算法要通过迭代器才能访问容器中的元素

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

容器算法迭代器初识

STL中最常用的容器为Vector,可以理解为数组

vector存放内置数据类型

容器:vector

算法:for_each

迭代器:vector<int>::iterator

复制代码
void myPrint(int num)
{
    cout << num << endl;
}
void test01()
{
    //创建vector容器对象,且通过模板参数指定容器中存放的数据的类型
    vector<int> array;
    //向容器中放数据
    array.push_back(10);
    array.push_back(20);
    array.push_back(30);
    array.push_back(40);
    //每个容器都有自己的迭代器,迭代器用来遍历容器中的元素
    //array.begin()返回迭代器,这个迭代器指向容器中第一个数据
    //array.end()返回迭代器,这个迭代器指向容器元素的最后一个元素的下一个位置
    //vector<int>::iterator 拿到vector<int>这种容器的迭代器类型
    //第一种遍历方式
    vector<int>::iterator begin = array.begin();
    vector<int>::iterator end = array.end();
    while (begin != end)
    {
        cout << *begin << endl;
        begin++;
    }
    //第二种遍历方式
    for (vector<int>::iterator i = array.begin(); i != array.end(); ++i)
    {
        cout << *i << endl;
    }
    //第三种遍历方式,利用STL提供遍历算法
    //头文件algorithm
    for_each(array.begin(), array.end(), myPrint);
}

Vector存放自定义数据类型

复制代码
void test01()
{
    vector<Person> v;
    v.push_back(Person("aaa", 11));
    v.push_back(Person("bbb", 23));
    v.push_back(Person("ccc", 34));
    v.push_back(Person("ddd", 24));
    v.push_back(Person("eee", 41));
    for (vector<Person>::iterator i = v.begin(); i != v.end(); ++i)
    {
        //cout << "姓名:" << i->m_Name << ",年龄:" << i->m_Age << endl;
        cout << "姓名:" << (*i).m_Name<< ",年龄:" << (*i).m_Age << endl;
    }  
}
void test02()
{
    vector<Person*> v;
    Person p1 = Person("aaa", 11);
    Person p2("bbb", 23);
    Person p3("ccc", 34);
    Person p4("ddd", 24);
    Person p5("eee", 31);
    v.push_back(&p1);
    v.push_back(&p2);
    v.push_back(&p3);
    v.push_back(&p4);
    v.push_back(&p5);
    for (vector<Person*>::iterator i = v.begin(); i != v.end(); ++i)
    {
        //cout << "姓名:" << i->m_Name << ",年龄:" << i->m_Age << endl;
        cout << "姓名:" << (*i)->m_Name << ",年龄:" << (*i)->m_Age << endl;
    }
}

Vector容器嵌套容器

类似二维数组

复制代码
void test01()
{
    vector<vector<int>> v;
    vector<int>v1;
    vector<int>v2;
    vector<int>v3;
    vector<int>v4;
    for (int i = 0; i < 4; ++i)
    {
        v1.push_back(i + 1);
        v2.push_back(i + 2);
        v3.push_back(i + 3);
        v4.push_back(i + 4);
    }
    //把小容器插入到大容器中
    v.push_back(v1);
    v.push_back(v2);
    v.push_back(v3);
    v.push_back(v4);
    //通过大容器,把所有数据遍历一遍
    for (vector<vector<int>>::iterator it = v.begin(); it != v.end(); ++it)
    {
        // (*it) ---容器 vector<int>
        for (vector<int>::iterator vit = (*it).begin(); vit != (*it).end(); ++vit)
        //for (vector<int>::iterator vit = it->begin(); vit != it->end(); ++vit)
        {
            cout <<*vit << " ";
        }
        cout << endl;
    }
}
相关推荐
吴建旭 智宅焕15 小时前
智能家居全国交付中执行端能力跃迁的架构设计:从标准装调到交付专家的系统化路径
网络·网络协议·智能家居
Eyfcom18 小时前
〖全球化架构 05〗跨国网络专线优化:QUIC 协议与 SD-WAN 在跨境传输中的实战
网络·架构·跨境物流快递系统·全球化架构
Dream Cosmos19 小时前
传输层协议之UDP
网络·网络协议·udp
梦到啥说啥21 小时前
Linux网络编程:UDP网络协议
linux·网络协议·udp
鸿蒙开发爱好者1 天前
下班后做的小工具和小游戏,我把它们整理成了 WyanHub
网络·人工智能·职场和发展·个人开发
乐橙开放平台1 天前
海康和大华摄像头能统一管理吗?可以通过 GB28181 或视频融合平台接入
网络·后端·物联网·音视频
张小姐的猫1 天前
【基于 WebSocket 的多用户网页五子棋】—— 项目结构设计与实用工具类模块
网络·websocket·网络协议
QXWZ_IA1 天前
测绘单位采购RTK:设备价格、账号年费、售后,用时间轴分权重
网络·人工智能·安全
IT大白鼠1 天前
GitLab 未认证 RCE 应急实战CVE-2026-97229(CVSS 10.0)
网络·安全·gitlab
陈希1231 天前
Linux 网络诊断工具实战:ping、curl、tcpdump、mtr、dig 用法详解
linux·网络·tcpdump