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;
    }
}
相关推荐
IpdataCloud1 小时前
资源受限设备上轻量级IP查询模块的部署方法
网络·数据库·网络协议·tcp/ip
eleven40961 小时前
穿透内容审查与阻断:基于 DNS TXT 记录的动态服务发现与客户端安全加固实践
网络协议·ios·app
韭菜张师傅2 小时前
Ceph MDS 命令详解
网络·ceph
浪游东戴河2 小时前
网线简介及分类
运维·服务器·网络
羸弱的穷酸书生2 小时前
跟AI学一手之渗透测试智能体
网络·人工智能
榴莲omega2 小时前
第7天:网络进阶——TCP/UDP、WebSocket、长连接
javascript·网络·tcp/ip·udp·八股
@猿程序3 小时前
ShardingSphere自定义分片算法与Redis动态规则加载实战
网络·redis·算法
Du_chong_huan3 小时前
《网络是怎样连接的》精读版 第五章总述
网络·计算机网络
feng一样的男子3 小时前
Rocky Linux 9 配置 IPv6 完整指南
linux·网络
七夜zippoe3 小时前
OpenClaw CLI 完整命令手册
linux·服务器·网络·cli·openclaw·命令手册