• 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::iterator

    1. void myPrint(int num)
    2. {
    3. cout << num << endl;
    4. }
    5. void test01()
    6. {
    7. //创建vector容器对象,且通过模板参数指定容器中存放的数据的类型
    8. vector<int> array;
    9. //向容器中放数据
    10. array.push_back(10);
    11. array.push_back(20);
    12. array.push_back(30);
    13. array.push_back(40);
    14. //每个容器都有自己的迭代器,迭代器用来遍历容器中的元素
    15. //array.begin()返回迭代器,这个迭代器指向容器中第一个数据
    16. //array.end()返回迭代器,这个迭代器指向容器元素的最后一个元素的下一个位置
    17. //vector<int>::iterator 拿到vector<int>这种容器的迭代器类型
    18. //第一种遍历方式
    19. vector<int>::iterator begin = array.begin();
    20. vector<int>::iterator end = array.end();
    21. while (begin != end)
    22. {
    23. cout << *begin << endl;
    24. begin++;
    25. }
    26. //第二种遍历方式
    27. for (vector<int>::iterator i = array.begin(); i != array.end(); ++i)
    28. {
    29. cout << *i << endl;
    30. }
    31. //第三种遍历方式,利用STL提供遍历算法
    32. //头文件algorithm
    33. for_each(array.begin(), array.end(), myPrint);
    34. }

    Vector存放自定义数据类型

    1. void test01()
    2. {
    3. vector<Person> v;
    4. v.push_back(Person("aaa", 11));
    5. v.push_back(Person("bbb", 23));
    6. v.push_back(Person("ccc", 34));
    7. v.push_back(Person("ddd", 24));
    8. v.push_back(Person("eee", 41));
    9. for (vector<Person>::iterator i = v.begin(); i != v.end(); ++i)
    10. {
    11. //cout << "姓名:" << i->m_Name << ",年龄:" << i->m_Age << endl;
    12. cout << "姓名:" << (*i).m_Name<< ",年龄:" << (*i).m_Age << endl;
    13. }
    14. }
    15. void test02()
    16. {
    17. vector<Person*> v;
    18. Person p1 = Person("aaa", 11);
    19. Person p2("bbb", 23);
    20. Person p3("ccc", 34);
    21. Person p4("ddd", 24);
    22. Person p5("eee", 31);
    23. v.push_back(&p1);
    24. v.push_back(&p2);
    25. v.push_back(&p3);
    26. v.push_back(&p4);
    27. v.push_back(&p5);
    28. for (vector<Person*>::iterator i = v.begin(); i != v.end(); ++i)
    29. {
    30. //cout << "姓名:" << i->m_Name << ",年龄:" << i->m_Age << endl;
    31. cout << "姓名:" << (*i)->m_Name << ",年龄:" << (*i)->m_Age << endl;
    32. }
    33. }

    Vector容器嵌套容器

    类似二维数组

    1. void test01()
    2. {
    3. vector<vector<int>> v;
    4. vector<int>v1;
    5. vector<int>v2;
    6. vector<int>v3;
    7. vector<int>v4;
    8. for (int i = 0; i < 4; ++i)
    9. {
    10. v1.push_back(i + 1);
    11. v2.push_back(i + 2);
    12. v3.push_back(i + 3);
    13. v4.push_back(i + 4);
    14. }
    15. //把小容器插入到大容器中
    16. v.push_back(v1);
    17. v.push_back(v2);
    18. v.push_back(v3);
    19. v.push_back(v4);
    20. //通过大容器,把所有数据遍历一遍
    21. for (vector<vector<int>>::iterator it = v.begin(); it != v.end(); ++it)
    22. {
    23. // (*it) ---容器 vector<int>
    24. for (vector<int>::iterator vit = (*it).begin(); vit != (*it).end(); ++vit)
    25. //for (vector<int>::iterator vit = it->begin(); vit != it->end(); ++vit)
    26. {
    27. cout <<*vit << " ";
    28. }
    29. cout << endl;
    30. }
    31. }
  • 相关阅读:
    Node.js单点登录SSO详解:Session、JWT、CORS让登录更简单
    解决vscode中git push/pull需要输入用户名和密码的问题
    SpringBoot全局异常配置
    华为设备配置攻击溯源命令
    包管理工具之npm也慌了?
    MySQL binlog集市的项目小结
    Hifiasm-meta | 你没看错!基于宏基因组的完成图!!
    HJ2 计算某字符出现次数
    【Vue】实现商品列表的无限加载
    unity shader屏幕后处理
  • 原文地址:https://blog.csdn.net/ThePaK/article/details/133222854