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;
    }
}
相关推荐
Tony聊跨境2 小时前
反向代理服务器的用途是什么?
网络·网络协议·tcp/ip·智能路由器·ip
立昂4 小时前
关于“内网可以访问21端口,通过防火墙映射后无法访问”的问题解决
网络·智能路由器
网络安全queen4 小时前
认识网络安全
网络·网络协议·网络安全
RememberLey4 小时前
【eNSP】ISIS动态路由协议实验
网络·架构·智能路由器·ensp·动态路由协议·isis·huawei
测试的艺术5 小时前
网络知识1-TCP/IP模型
网络·网络协议·tcp/ip
დ旧言~5 小时前
实战项目 Boost 搜索引擎
服务器·c语言·前端·网络·汇编·c++
Sagice5 小时前
CVE-2019-13272(Linux本地内核提权)
linux·运维·服务器·网络·安全
李李李李李同学6 小时前
等保测评讲解初测和复测有哪些区别
网络·安全·信息安全等级保护测评
长弓三石6 小时前
鸿蒙网络编程系列50-仓颉版TCP回声服务器示例
网络·tcp/ip·harmonyos
网络安全-老纪8 小时前
网工考试——网络安全
网络·安全·web安全