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;
    }
}
相关推荐
..过云雨5 小时前
多路转接select系统调用详解
网络·网络协议·tcp/ip
爱编码的傅同学5 小时前
【计算机网络】初识网络
网络·计算机网络
晚霞的不甘5 小时前
Flutter for OpenHarmony 打造沉浸式呼吸引导应用:用动画疗愈身心
服务器·网络·flutter·架构·区块链
CHENKONG_CK6 小时前
化工危化品桶装追溯:RFID 全流程可视化解决方案
网络
JMchen1236 小时前
Android UDP编程:实现高效实时通信的全面指南
android·经验分享·网络协议·udp·kotlin
临水逸6 小时前
一次路径穿越漏洞引发的NAS安全危机:飞牛fnOS漏洞深度剖析与用户自救指南
网络·安全·web安全
岁岁种桃花儿6 小时前
注册中心宕机后,RPC调用还能成功吗?主流框架实测级分析
zookeeper·eureka·rpc
强风7946 小时前
Linux-传输层协议TCP
linux·网络·tcp/ip
狮驼岭的小钻风6 小时前
汽车V模型开发流程、ASPICE、汽车功能安全的基石是国际标准 ISO 26262
网络·安全·汽车
崎岖Qiu7 小时前
【计算机网络 | 第十篇】以太网的 MAC 层
网络·笔记·计算机网络·mac地址