• C++ STL进阶与补充(基础)


    1、STL基础

    STL称为标准模板库,可以分为容器container,迭代器iterator和算法algorithm。容器和算法之间通过迭代器进行无缝连接。STL的几乎所有代码都采用了类模板或者函数模板。

    STL大体分为六大组件:容器、算法、迭代器、仿函数、适配器、空间配置器

    容器:各种数据结构,如vector,list,deque,set,map等,用于存放数据。

    算法:各种常用算法,如sort,find,copy,for_each遍历。

    迭代器:扮演了容器和算法之间的胶合剂。

    仿函数:行为类似函数,可作为算法的某种策略。

    适配器:一种用来修饰容器或者仿函数或者迭代器接口的东西。

    空间配置器:负责空间的配置与管理。

    容器可以分为序列式容器和关联式容器,前者强调值的排序,序列式容器中每个元素均有固定的位置;关联式容器中各元素之间没有严格上的物理顺序关系,如二叉树。

    算法用于解决逻辑或数学上的问题,可分为质变算法和非质变算法。质变算法是指运算过程中会更改元素的内容,例如拷贝、替换、删除等;非质变算法指的是运算过程中不会改变区间内元素的内容,例如查找、计数、遍历、寻找极值等。

    算法要通过迭代器才能访问容器中的元素,每个容器都有自己专属的迭代器,迭代器的使用非常类似于指针。

        迭代器可分为5种:

    种类

    功能

    支持运算

    输入迭代器

    对数据的只读访问

    只读,支持++、==、!=

    输出迭代器

    对数据的只写访问

    只写,支持++

    前向迭代器

    读写操作,并能够向前推进迭代器

    读写,支持++、==、!=

    双向迭代器

    读写操作,并能向前和向后

    读写,支持++、--

    随机访问迭代器

    读写操作,可以以跳跃的方式访问任意数据,功能最强的迭代器

    读写,支持++、--、[n]、<、>、<=、>=

    目前接触的迭代器一般都是后两个迭代器。下面简单给了一个例子来说明迭代器与容器。

    1. #include<vector>
    2. #include<iostream>
    3. #include<algorithm>
    4. using namespace std;
    5. void test01()
    6. {
    7. //创建一个vector容器,数组
    8. vector<int> v;
    9. //向容器中插入数据
    10. v.push_back(10);
    11. v.push_back(20);
    12. v.push_back(30);
    13. v.push_back(40);
    14. vector<int>::iterator itBegin = v.begin(); //起始迭代器,指向容器中第一个元素
    15. vector<int>::iterator itEnd = v.end(); //结束迭代器,指向容器中最后一个元素的下一个位置
    16. //第一种遍历方式
    17. //while (itBegin != itEnd)
    18. //{
    19. // cout << *itBegin << endl;
    20. // itBegin++;
    21. //}
    22. //第二种遍历方式
    23. for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
    24. {
    25. cout << *it << endl;
    26. }
    27. //第三种遍历方式 for_each
    28. }
    29. int main()
    30. {
    31. test01();
    32. }

    2、容器中存放自定义数据类型

    1. #include<vector>
    2. #include<iostream>
    3. #include<algorithm>
    4. #include"string"
    5. using namespace std;
    6. class Person
    7. {
    8. public:
    9. Person(string name, int age)
    10. {
    11. this->m_Name = name;
    12. this->m_Age = age;
    13. }
    14. string m_Name;
    15. int m_Age;
    16. };
    17. void test01()
    18. {
    19. //创建一个vector容器,数组
    20. vector<Person> v;
    21. //向容器中插入数据
    22. Person p1("WXQ",10);
    23. Person p2("QWE",15);
    24. Person p3("QTR", 20);
    25. v.push_back(p1);
    26. v.push_back(p2);
    27. v.push_back(p3);
    28. for (vector<Person>::iterator it = v.begin(); it != v.end(); it++)
    29. {
    30. cout << (*it).m_Name <<" " << (*it).m_Age<<endl;
    31. }
    32. }
    33. void test02()
    34. {
    35. //存放自定义数据类型的指针
    36. vector<Person*> v1;
    37. Person p1("WXQ", 10);
    38. Person p2("QWE", 15);
    39. Person p3("QTR", 20);
    40. v1.push_back(&p1);
    41. v1.push_back(&p2);
    42. v1.push_back(&p3);
    43. for (vector<Person*>::iterator it = v1.begin(); it != v1.end(); it++)
    44. {
    45. cout << (*it)->m_Name << " " << (*it)->m_Age << endl;
    46. }
    47. }
    48. int main()
    49. {
    50. test01();
    51. test02();
    52. }

    3、容器嵌套容器

    类似于实现二维数组,实际中用的很多。

    遍历二维向量时,首先先用一个迭代器遍历各个向量的首元素,在循环内部再遍历该向量中的各个元素。

    1. #include<vector>
    2. #include<iostream>
    3. #include<algorithm>
    4. #include"string"
    5. using namespace std;
    6. void test01()
    7. {
    8. vector<vector<int>> v;
    9. //创建小容器
    10. vector<int> v1;
    11. vector<int> v2;
    12. vector<int> v3;
    13. vector<int> v4;
    14. for (int i = 0; i < 4; i++)
    15. {
    16. v1.push_back(i + 1);
    17. v2.push_back(i + 2);
    18. v3.push_back(i + 3);
    19. v4.push_back(i + 4);
    20. }
    21. //将小容器插入到大容器
    22. v.push_back(v1);
    23. v.push_back(v2);
    24. v.push_back(v3);
    25. v.push_back(v4);
    26. //通过大容器遍历所有数据
    27. for (vector<vector<int>>::iterator it = v.begin(); it != v.end(); it++)
    28. {
    29. //(*it)——容器vector<int>
    30. for (vector<int>::iterator vit = (*it).begin(); vit != (*it).end(); vit++)
    31. {
    32. cout << *vit << " ";
    33. }
    34. cout << endl;
    35. }
    36. }
    37. int main()
    38. {
    39. test01();
    40. }

  • 相关阅读:
    芯片科普 |ATE测试如何入门?ATE测试的工作内容和要求?
    程序员的护城河:技术深度、创新精神与软实力的完美结合
    代码随想录 - Day37 - 贪心算法
    VR全景平台应该具备哪些功能,怎样选择VR全景平台
    【面试题】ES6语法五之箭头函数
    想要保护服务器的安全,使用哪个软件比较好?
    分类预测 | Matlab实现PSO-GRU-Attention粒子群算法优化门控循环单元融合注意力机制多特征分类预测
    什么是单点登录?什么又是 OAuth2.0?
    node.js学习笔记 09核心模块
    神经网络是参数模型吗,神经网络参数量计算
  • 原文地址:https://blog.csdn.net/Lao_tan/article/details/125426622