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;
    }
}
相关推荐
AI创世纪27 分钟前
WIN11 UEFI漏洞被发现, 可以绕过安全启动机制
网络·安全
小马爱打代码3 小时前
TCP 详解
网络·网络协议·tcp/ip
聿琴惜荭顏丶4 小时前
.NET MAUI进行UDP通信(二)
网络协议·udp·.net
努力的小T4 小时前
基于 Bash 脚本的系统信息定时收集方案
linux·运维·服务器·网络·云计算·bash
TS_forever0074 小时前
【华为路由的arp配置】
网络·华为
hkNaruto4 小时前
【P2P】基于 Nebula 的 P2P 通信技术的虚拟局域网游戏设计方案
网络协议·游戏·p2p
Andya_net5 小时前
网络安全 | 0day漏洞介绍
网络·安全·web安全
某风吾起5 小时前
linux系统中的 scp的使用方法
linux·服务器·网络
NoneCoder5 小时前
JavaScript系列(42)--路由系统实现详解
开发语言·javascript·网络
阿猿收手吧!5 小时前
【Linux网络总结】字节序转换 收发信息 TCP握手挥手 多路转接
linux·服务器·网络·c++·tcp/ip