1.基本概念

STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称。虽然主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间。
STL的从广义上讲分为三部分:algorithm(算法)、container(容器)和iterator(迭代器),容器和算法通过迭代器可以进行无缝地连接。几乎所有的代码都采 用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。在C++标准中,STL被组织为下面的13个头文件:
<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack> 和<utility>
此外,C++的STL还包括仿函数、适配器以及空间适配器。

2.STL的优势

  1. STL是C++的一部分,因此不用额外安装什么,它被内建在你的编译器之内。
  2. STL的一个重要特点是数据结构和算法的分离。尽管这是个简单的概念,但是这种分离确实使得STL变得非常通用。例如,在STL的vector容器中,可以放入元素(对象)、基础数据类型变量、指针;STL的sort()函数可以用来操作vector,list等容器。
  3. 程序员可以不用思考STL具体的实现过程,只要能够熟练使用STL就OK了。这样他们就可以把精力放在程序开发的别的方面。
  4. STL具有高可重用性,高性能,高移植性,跨平台的优点。
  5. STL有以下这些好处,我们知道STL无疑是最值得C++程序员骄傲的一部分。每一个C++程序员都应该好好学习STL。只有能够熟练使用STL的程序员,才是好的C++程序员。

高可重用性: STL中几乎所有的代码都采用了模板类和模版函数的方式实现,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。
高性能:如map可以高效地从十万条记录里面查找出指定的记录,因为map是采用红黑树的变体实现的。(红黑树是平横二叉树的一种)
高移植性:如在项目A上用STL编写的模块,可以直接移植到项目B上。
跨平台:如用windows的Visual Studio编写的代码可以在Mac OS的XCode上直接编译。

3.容器

  在实际的开发过程中,数据结构本身的重要性不会逊于操作于数据结构的算法的重要性,当程序中存在着对时间要求很高的部分时,数据结构的选择就显得更加重要。
  经典的数据结构数量有限,但是我们常常重复着一些为了实现向量、链表等结构而编写的代码,这些代码都十分相似,只是为了适应不同数据的变化而在细节上有所出入。STL容器就为我们提供了这样的方便,它允许我们重复利用已有的代码实现构造自己的特定类型下的数据结构,通过设置一些模板,STL容器对最常用的数据结构提供了支持,这些模板的参数允许我们指定容器中元素的数据类型,可以将我们许多重复而乏味的工作简化。
  在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对象的指针,这种对象类型就叫做容器。

容器部分主要由头文件<vector>,<list>,<deque>,<set>,<map>,<stack> 和<queue> 组成

容器的分类:

标准C++的STL框架中的容器主要有两大类:

序列式容器(Sequence containers): 将一组具有相同类型T的对象,以严格的线性形式组织在一起。
每个元素都有固定位置--取决于插入时机和地点,和元素值无关。如:

vector(向量)、deque(double-ended queue双端队列)、list(表)

序列容器可以视为数组和链表的推广。

关联式容器(Associated containers): 关联容器的特点是(键)有序的,即元素是按预定义的键顺序(如升序)插入的。
元素位置取决于特定的排序准则,和插入顺序无关 :

set<Key>(集合)multiset<Key>(多重集合)map<Key, T>(映射/映像)multimap<Key, T>(多重映射)hash_set<Key, H>(散列集)hash_map<Key, T, H>(散列映射)hash_multimap<Key, T, H>(散列多映射)

容器适配器(container adapter)不是独立的容器,只是某种容器的变种,它提供原容器的一个专用的受限接口。特别是,容器适配器不提供迭代器。

stack<T>(栈)queue<T>(队列)priority_queue<T>(优先队列)

4.迭代器

  软件设计有一个基本原则,所有的问题都可以通过引进一个间接层来简化,这种简化在STL中就是用迭代器来完成的。概括来说,迭代器在STL中用来将算法和容器联系起来,起着一种黏和剂的作用。几乎STL提供的所有算法都是通过迭代器存取元素序列进行工作的,每一个容器都定义了其本身所专有的迭代器,用以存取容器中的元素。
  迭代器部分主要由头文件<utility>,<iterator>和<memory>组成。<utility>是一个很小的头文件,它包括了贯穿使用在STL中的几个模板的声明,<iterator>中提供了迭代器使用的许多方法,而对于<memory>的描述则十分的困难,它以不同寻常的方式为容器中的元素分配存储空间,同时也为某些算法执行期间产生 的临时对象提供机制,<memory>中的主要部分是模板类allocator,它负责产生所有容器中的默认分配器。
  简单来说,迭代器就是一个指针,指向具体容器中的具体元素,解引用以后的数据类型就是容器元素的数据类型。是容器和算法的粘合剂,是一个间接层。

5.算法

  函数库对数据类型的选择对其可重用性起着至关重要的作用。举例来说,一个求方根的函数,在使用浮点数作为其参数类型的情况下的可重用性肯定比使用整型作为它的参数类性要高。而C++通过模板的机制允许推迟对某些类型的选择,直到真正想使用模板或者说对模板进行特化的时候,STL就利用了这一点提 供了相当多的有用算法。它是在一个有效的框架中完成这些算法的——可以将所有的类型划分为少数的几类,然后就可以在模版的参数中使用一种类型替换掉同一种类中的其他类型。
  STL提供了大约100个实现算法的模版函数,比如算法for_each将为指定序列中的每一个元素调用指定的函数,stable_sort以 你所指定的规则对序列进行稳定性排序等等。这样一来,只要熟悉了STL之后,许多代码可以被大大的化简,只需要通过调用一两个算法模板,就可以完成所需要 的功能并大大地提升效率。
  算法部分主要由头文件,和组 成。是所有STL头文件中最大的一个(尽管它很好理解),它是由一大堆模版函数组成的,可以认为每个函数在很大程度上都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。中则定义了一些模板类,用以声明函数对象。

说白了就是一系列的函数集合,这些函数通常是模板函数。

代码示例

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;void func1()
{// 定义一个容器:用来存数据、存 int 数据vector<int> a;a.push_back(1);a.push_back(2);a.push_back(1);a.push_back(3);a.push_back(1);a.push_back(4);a.push_back(1);a.push_back(5);// 迭代器,提供了遍历容器的统一方法//vector<int>::iterator it;//for (it = a.begin(); it != a.end(); it++)//{//  cout << *it << " ";//}//cout << endl;vector<int>::iterator it = a.begin();while (it != a.end()){cout << *it << " ";it++;}cout << endl;// 算法:用来处理容器中的数据,通过迭代器int num = count(a.begin(), a.end(), 1);cout << num << endl;
}class Student
{
public:Student (int id, int age){this->id = id;this->age = age;}void print(){printf ("id = %d, age = %d\n", id, age);}
private:int id;int age;
};void func2()
{Student s1(10,20);Student s2(11,21);Student s3(12,22);Student s4(13,23);Student s5(14,24);vector<Student> v;v.push_back(s1);v.push_back(s2);v.push_back(s3);v.push_back(s4);v.push_back(s5);vector<Student>::iterator it = v.begin();while (it != v.end()){it->print();it++;}
}void func3()
{Student s1(10,20);Student s2(11,21);Student s3(12,22);Student s4(13,23);Student s5(14,24);vector<Student*> v;
//  v.push_back(&s1);
//  v.push_back(&s2);
//  v.push_back(&s3);
//  v.push_back(&s4);
//  v.push_back(&s5);v.push_back(new Student(10,20));v.push_back(new Student(11,21));v.push_back(new Student(12,22));v.push_back(new Student(13,23));v.push_back(new Student(14,24));vector<Student*>::iterator it = v.begin();while (it != v.end()){(*it)->print();it++;}
}int main()
{// func1();// func2();func3();return 0;
}

C++之STL理论基础相关推荐

  1. C++STL理论基础

    C++STL理论基础 开发工具与关键技术:C++.VisualStudio 作者:何任贤 撰写时间:2019年08月16日 STL(StandardTemplateLibrary,标准模板库)是惠普实 ...

  2. c++STL(标准模板库)理论基础

    标准模板库理论基础 基本概念 STL详细的说六大组件 使用STL的好处 容器 容器的概念 容器的分类 迭代器 算法 C++标准库 标准库中与语言支持功能相关的头文件 支持流输入/输出的头文件 与诊断功 ...

  3. STL(标准模板库)理论基础与容器

    10.1 STL(标准模板库)理论基础 10.1.1基本概念 STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.现然主要出现在C++中,但在被 ...

  4. STL学习系列一:STL(标准模板库)理论基础

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

  5. 10、STL实用技术专题

    10.STL实用技术专题 10.1STL(标准模板库)理论基础 10.1.1基本概念 #include <iostream> #include <vector> #includ ...

  6. STL库(C++11)提供的异步执行方法的方式

    在进行并发编程的时候难免会遇到异步执行时候,现代C++标准库提供了几种异步执行的方式,本文收集整理了一下,以备将来翻阅. Thread方式 Thread 是STL提供的一种快捷创建线程的方式,极大方便 ...

  7. C++ 笔记(24)— STL map 类(map实例化、插入、查找、删除)

    1. STL 映射类简介 map 和 multimap 是键-值对容器,支持根据键进行查找,区别在于,后者能够存储重复的键,而前者只能存储唯一的键. 为了实现快速查找, STL map 和 multi ...

  8. C++ 笔记(23)— STL vector 类(实例化 vector、末尾插入、指定位置插入、数组方式访问元素、指针方式访问元素、删除元素、大小与容量区别)

    1. vector 特点 vector 是一个模板类,提供了动态数组的通用功能,具有如下特点: 在数组末尾添加元素所需的时间是固定的,即在末尾插入元素的所需时间不随数组大小而异,在末尾删除元素也如此: ...

  9. C++ 笔记(22)— STL string 类(字符串赋值、访问、拼接、查找、翻转、大小写转换)

    1. 实例化和赋值 STL string #include <string> #include <iostream>int main () {using namespace s ...

最新文章

  1. Windows驱动开发学习笔记(四)—— 3环与0环通信(常规方式)
  2. [SAP-SD]Sales Order 中的User Exit开发
  3. 【MySQL随手记】字符集编码的查看、指定与修改语句
  4. java 生成msg文件_java – 如何获取.MSG文件的MIME类型?
  5. mysql基本命令入门
  6. AS3图像抖动效果源码。
  7. java request 处理过程_小猿圈Java开发之从代码看spring mvc请求处理过程
  8. fortran_Fortran 60岁生日快乐
  9. nodejs html引用js_nodejs做出最简单的网页服务端。【501】
  10. 群体智能优化算法之蟑螂算法((Cockroach Swarm Optimization,CSO)
  11. 计算机应用历年高考真题,春季高考历年真题-2013年天津市春季高考计算机试卷...
  12. 【数理统计】一题了解拟合优度检验
  13. Java基础笔记(初学者适用)
  14. 电力行业适合学习的开源软件
  15. Spring Cloud(十二):Spring Cloud Zuul 限流详解(附源码)(转)
  16. 深入理解Flash Player的安全域(Security Domains)
  17. 别在找提高C++晦涩难懂的知识了。提高效率!这里有C++STL——全面总结详细教程(附案例解析)(持续更新中)
  18. linux之getcwd函数解析,Linux 中C语言getcwd()函数的用法
  19. Java继承关系之富二代和他爹
  20. php 自定义图片排版,照片拼图在线制作 自带多种照片拼图模板,自由排版将多张照片合成一张...

热门文章

  1. 【算法系列之十四】最大子序和
  2. Python数据预处理之异常值的处理——【自定义的three_sigma()函数、boxplot()方法】
  3. leetcode340. 至多包含 K 个不同字符的最长子串
  4. 数据库2.1.1mysql的特点
  5. UNIX(多线程):18---异步任务提供者(Provider) 介绍(续)
  6. C++(STL):35---multimap容器
  7. pytorch学习 训练一个分类器(五)
  8. LINUX下动态链接库的使用-dlopen dlsym dlclose dlerror
  9. Python(28)-异常
  10. Python模块(1)-Argparse 简易使用教程