1 STL概述

STL是StandardTemplateLibrary的简称,标准模板库,惠普实验室开发的一系列软件的统称。它是由AlexanderStepanov、MengLee和DavidRMusser在惠普实验室工作时所开发出来的。这可能是一个历史上最令人兴奋的工具的最无聊的术语。从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。这里的“容器”和算法的集合指的是世界上很多聪明人很多年的杰作。STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。STL现在是C++的一部分,因此不用额外安装什么。
——搜狗百科

我认为其本质是为了提升代码复用性,使得之后的程序员可以站在前人的肩膀上,不必重复大量造轮子的工作,以减少企业人力资源的浪费等(更好压榨员工(打趣) )。

1.1 STL基本概念

STL广义上分为:容器(container) 算法(algorithm) 迭代器(iterator)

1.2 STL 六大组件

容器(vector,list…)
算法(sort,find…)
迭代器(扮演容器算法之间的胶合剂,所有STL容器都有自己的专属迭代器)
仿函数(行为类似函数,可作为算法的某种策略)
适配器(一种用来修饰容器或者仿函数或迭代器接口的东西)
空间配置器(空间的配置与管理)

六大件的交互关系,容器通过空间配置器取得数据存储空间,算法通过迭代器存储容器中的内容,仿函数可以协助算法完成不同策略的变化,适配器可以修饰仿函数。

1.3 STL优点

  • 高可重复性
  • 高性能
  • 高移植性

但是正因为程序员不用思考STL具体的实现过程,对于初学者应该尝试自己写。

2.1 容器

序列式容器(排序,如Vector,List,Deque容器)
关联式容器(元素在容器中并没有保存元素置入容器时的逻辑顺序)

2.2 算法

质变算法(运算过程改变区间内元素内容)
非质变算法(不改变,如遍历,查找)

2.3 迭代器

举例:
iterator模式定义:提供一种方法,使之能够依序访问某个容器所含的各个元素,而又无需暴露该容器内部展示方式。
种类:
Input iterator(输入迭代器)
读,不能写;只支持自增运算

Output iterator(输出迭代器)
写,不能读;只支持自增运算

Forward iterator(前向迭代器)
读和写;只支持自增运算

Bidirectional iterator(双向迭代器)
读和写;支持自增和自减运算

Random access iterator(随机访问迭代器)
读和写;支持完整的迭代器算术运算

2.4 示例

  1. #include<iostream>
  2. using namespace std;
  3. #include<algorithm>
  4. #include<string>
  5. //容器 vector
  6. #include<vector>
  7. void myPrint(int v)
  8. {
  9. cout << v << endl;
  10. }
  11. void text02()
  12. {
  13. vector<int> v;//声明
  14. //插入
  15. v.push_back(10);
  16. v.push_back(20);
  17. v.push_back(30);
  18. v.push_back(40);
  19. v.push_back(50);
  20. //遍历
  21. vector<int>::iterator itBegin = v.begin();
  22. vector<int>::iterator itEnd = v.end();
  23. //第一种
  24. /*while (itBegin != itEnd)
  25. {
  26. cout << *itBegin << endl;
  27. itBegin++;
  28. }*/
  29. //第二种
  30. /*for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
  31. {
  32. cout << *it << endl;
  33. }*/
  34. //第三种(头文件#include<algorithm>,函数myPrint)
  35. for_each(v.begin(), v.end(), myPrint);
  36. }
  37. //迭代器 遍历功能 用指针理解,普通指针也算一种迭代器
  38. void text01()
  39. {
  40. int arr[5] = { 1,2,3,4,6 };
  41. int* p = arr;
  42. for (int i = 0; i < 5; i++)
  43. {
  44. cout << *(p++) << endl;
  45. }
  46. }
  47. //操作自定义数据类型
  48. class Person
  49. {
  50. public:
  51. Person(string name, int age)
  52. {
  53. this->m_Name = name;
  54. this->m_Age = age;
  55. }
  56. string m_Name;
  57. int m_Age;
  58. };
  59. void text03()
  60. {
  61. vector<Person> v;
  62. Person p1("zimei",10);
  63. Person p2("xiedalao", 10);
  64. v.push_back(p1);
  65. v.push_back(p2);
  66. //for (auto k : v)
  67. //{
  68. // cout << k.m_Age << k.m_Name << endl;
  69. //}
  70. for (vector<Person>::iterator it = v.begin(); it != v.end(); it++)
  71. {
  72. cout << "name:" << (*it).m_Name << "\tage:" << it->m_Age << endl;
  73. }
  74. }
  75. int main()
  76. {
  77. text01();
  78. text02();
  79. text03();
  80. return 0;
  81. }

基于黑马STL课程整理

1.1 STL基本概念的更多相关文章

  1. 泛型编程、STL的概念、STL模板思想及其六大组件的关系,以及泛型编程(GP)、STL、面向对象编程(OOP)、C++之间的关系

    2013-08-11 10:46:39 介绍STL模板的书,有两本比较经典: 一本是<Generic Programming and the STL>,中文翻译为<泛型编程与STL& ...

  2. STL 基本概念

    STL 基本概念 STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.现在是一个C++软件库,也是C++标准程序库的一部分,但在被引入C++之前 ...

  3. 7.4 C++标准模板库(STL)的概念

    参考:http://www.weixueyuan.net/view/6401.html 总结:  标准模板库为C++提供了完善的数据结构及算法. 标准模板库包括三部分:容器.算法和迭代器. 容器是对象 ...

  4. 63)对于STL基本概念东西 自己百度(没有整理)

    基础知识 看  C++进阶课程讲义的那个word文档

  5. stl中的容器、迭代器和算法----vector中的find实现

    来源 http://blog.csdn.net/huangyimin/article/details/6133650 stl包括容器.迭代器和算法: 容器 用于管理一些相关的数据类型.每种容器都有它的 ...

  6. stl之容器、迭代器、算法几者之间的关系

    转自:https://blog.csdn.net/bobodem/article/details/49386131 stl包括容器.迭代器和算法: 容器 用于管理一些相关的数据类型.每种容器都有它的优 ...

  7. <<C++标准程序库>>中的STL简单学习笔记

    0. 内容为个人学习笔记, 仅供参考, 如有错漏, 欢迎指正! 1. STL中的所有组件都是由模板构成的, 所以其元素可以是任意型别的. 组件有: - 容器: 管理某类对象的集合. 不同的容器有各自的 ...

  8. STL理论基础、容器、迭代器、算法

    一.STL基本概念 STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.现然主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段 ...

  9. 【STL学习笔记】一、STL体系

    目录 1.标准库以header files形式呈现 2.namespce命名空间 3.STL与OO 4.STL六组件及其关系 5.STL组件例子 6.range-based for statement ...

随机推荐

  1. js中(function(){}()),(function(){})(),$(function(){});之间的区别

    1. (function(){}())与(function(){})() 这两种写法,都是一种立即执行函数的写法,即IIFE (Immediately Invoked Function Express ...

  2. mybatis的一对多(collection)

    使用图解: 低效率查询: 高效率查询: 1 查询用联合查询 2<collection 里面不写column

  3. 基于Socket实现多人聊天室

    当前支持: 1.仅文字 2.加入聊天室提醒 3.退出聊天室提醒 可能出现的BUG: 1.可能出现客户端发送信息后不能及时推送,需要下一个客户端发送信息后一起推送 服务端代码: 1 package co ...

  4. 虫师Selenium2+Python_12、BDD框架之Lettuce入门

    http://www.cnblogs.com/fnng/p/3415609.html P293--简介: TDD(Test-Drivern-Development)测试驱动开发 ATDD(Accept ...

  5. [源码解析] NVIDIA HugeCTR,GPU版本参数服务器---(3)

    [源码解析] NVIDIA HugeCTR,GPU版本参数服务器---(3) 目录 [源码解析] NVIDIA HugeCTR,GPU版本参数服务器---(3) 0x00 摘要 0x01 回顾 0x0 ...

  6. Rust语言开发

    Rust开发 第一个程序 fn main() { println!("Hello, world!"); // 带!号的都是宏 并不是函数 } fn main() { let nam ...

  7. 【软件实施面试】MySQL和Oracle联合查询以及聚合函数面试总结

    软件实施面试系列文章第二弹,MySQL和Oracle联合查询以及聚合函数的面试总结.放眼望去全是MySQL,就不能来点Oracle吗?之前面过不少公司,也做过不少笔试题,现在已经很少做笔试题了.你肚子 ...

  8. Nginx安装启用

    安装版本为1.17.8. 1.安装Nginx依赖, pcre. openssl. gcc. zlib(推荐使⽤yum源⾃动安装) yum -y install gcc zlib zlib-devel ...

  9. Redis——入门学习笔记

    Redis学习 说到前面:这篇笔记只是我作为一个Redis新手,从0到认知的一个过程.后续会持续深入学习. 学习初衷和计划 学习Redis,因为这是热门技术,必须掌握的技术,别人都会我不会.就这一点就 ...

  10. vscode打开多个文件

    vscode短时间内打开多个文件会覆盖原先打开的文件,在右方编辑区只显示一个.若想每次打开,都新创建一个编辑,可以用以下2个简单的方法: 方法一:直接在右侧打开的文件上,Ctrl + S,保存一次,再 ...