一、STL基本概念

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>。

STL优点:

  1. STL是C++的一部分,因此不用额外安装什么,它被内建在你的编译器之内。
  2. STL的一个重要特点是数据结构和算法的分离。尽管这是个简单的概念,但是这种分离确实使得STL变得非常通用。例如,在STL的vector容器中,可以放入元素、基础数据类型变量、元素的地址;STL的sort()函数可以用来操作vector,list等容器。
  3. 程序员可以不用思考STL具体的实现过程,只要能够熟练使用STL就OK了。这样他们就可以把精力放在程序开发的别的方面。
  4. STL具有高可重用性,高性能,高移植性,跨平台的优点。
  • 高可重用性:STL中几乎所有的代码都采用了模板类和模版函数的方式实现,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。
  • 高性能:如map可以高效地从十万条记录里面查找出指定的记录,因为map是采用红黑树的变体实现的。(红黑树是平横二叉树的一种)
  • 高移植性:如在项目A上用STL编写的模块,可以直接移植到项目B上。
  • 跨平台:如用windows的Visual Studio编写的代码可以在Mac OS的XCode上直接编译。

二、三大组件介绍

1、容器

STL中容器是指存储有限数据元素的一种数据结构。在使用容器之前首先要根据自己使用的数据集和将要对数据结构采取的访问模式,比如增删改查,决定使用STL中的何种容器类型。

STL对定义的通用容器分三类:顺序容器关联容器容器适配器

顺序容器:此种容器元素的位置是由进入容器的时间和地点决定的;

关联容器:此种容器已经有规则,进入容器的元素的位置不是由进入容器的时间和地点决定的;

2、迭代器

我们使用容器的时候,迭代器是一个不可分割的部分。迭代器在STL中用来将算法和容器联系起来,起着一种胶着剂的作用。迭代器是一种检查容器内元素并遍历元素的数据类型。迭代器是一种行为类似指针的对象,它提供类似指针的功能,对容器成员的内容进行访问。

注意:每个迭代器是和每一个容器绑定的。

3、算法

通过有限步骤,解决问题。

STL提供了大约100个实现算法的模版函数,比如算法for_each将为指定序列中的每一个元素调用指定的函数,stable_sort以你所指定的规则对序列进行稳定性排序等等。这样一来,只要熟悉了STL之后,许多代码可以被大大的化简,只需要通过调用一两个算法模板,就可以完成所需要的功能并大大地提升效率。

C++通过模板的机制允许推迟对某些类型的选择,直到真正想使用模板或者说对模板进行特化的时候,STL就利用了这一点提供了相当多的有用算法。

算法部分主要由头文件<algorithm>,<numeric>和<functional>组成。<algorithm>是所有STL头文件中最大的一个(尽管它很好理解),它是由一大堆模版函数组成的,可以认为每个函数在很大程度上 都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。<numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。<functional>中则定义了一些模板类,用以声明函数对象。

三、案例:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std; //算法:负责统计某个元素的个数
int mycount(int* start, int* end, int val)
{
int num = ;
while (start != end)
{
if (*start == val)
{
num++;
}
start++;
}
return num;
} int main(void)
{
//数组 容器
int arr[] = { ,,,,,, };
int* pStart = arr;//指向元素的第一个元素
int* pEnd = &(arr[sizeof(arr) / sizeof(int)]); int num = mycount(pStart, pEnd, );
cout << "num:" << num << endl; return ;
}
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<vector>//动态数组 可变数组
#include<algorithm>//算法
using namespace std; void PrintVector(int v)
{
cout << v << " " ;
} //STL基本语法
void test01()
{
//定义一个容器,并且指定这个容器存放的元素类型为int
vector<int> v;
v.push_back();
v.push_back();
v.push_back();
v.push_back(); //通过STL提供的for_each算法
//容器提供的迭代器
//vector<int>::iterator 迭代器类型
vector<int>::iterator pBegin = v.begin();//第一个元素的位置
vector<int>::iterator pEnd = v.end();//最后一个元素的下一个的位置 //容器中可能存放基础的数据类型,也可能存放自定义的数据类型
for_each(pBegin, pEnd, PrintVector);
cout << endl;
} //容器也可存放自定义的数据类型
class Person
{
public:
Person(int age,int id):age(age),id(id){}
public:
int age;
int id;
}; void test02()
{
//创建容器,并且指定容器的元素类型是Person
vector<Person> v;
Person p1(, ), p2(, ), p3(, );
v.push_back(p1);
v.push_back(p2);
v.push_back(p3); //遍历
for (vector<Person>::iterator it = v.begin(); it != v.end();it++)
{
cout << (*it).age << " " << (*it).id << endl;
}
} //容器存放Person类型指针,并且for_each打印 或者 迭代器方式
void test03()
{
//创建容器,并且指定容器的元素类型是Person*
vector<Person*> v1;
Person p1(, ), p2(, ), p3(, );
v1.push_back(&p1);
v1.push_back(&p2);
v1.push_back(&p3); //遍历
for (vector<Person*>::iterator it = v1.begin(); it != v1.end();it++)
{
cout << (**it).age << " " << (**it).id << endl;
}
} // 容器嵌套容器 一个容器作为另一个容器的元素
void PrintVectorNest(vector<int> v)
{
vector<int>::iterator pBegin = v.begin();
vector<int>::iterator pEnd = v.end();
for_each(pBegin, pEnd, PrintVector);
} typedef vector<int>(VECTOR); void test04()
{
vector<vector<int>> v_nest;
vector<int> v1;
v1.push_back();
v1.push_back();
v1.push_back();
v1.push_back(); vector<int> v2;
v2.push_back();
v2.push_back();
v2.push_back();
v2.push_back(); v_nest.push_back(v1);
v_nest.push_back(v2); vector<VECTOR>::iterator pBegin = v_nest.begin();
vector<VECTOR>::iterator pEnd = v_nest.end();
for_each(pBegin, pEnd, PrintVectorNest);
cout << endl;
} int main(void)
{
test01();
test02();
test03();
test04(); return ;
}

STL理论基础、容器、迭代器、算法的更多相关文章

  1. C++ STL vector容器学习

    STL(Standard Template Library)标准模板库是C++最重要的组成部分,它提供了一组表示容器.迭代器.函数对象和算法的模板.其中容器是存储类型相同的数据的结构(如vector, ...

  2. STL的容器算法迭代器的设计理念

    1) STL的容器通过类模板技术,实现数据类型和容器模型的分离. 2) STL的迭代器技术实现了遍历容器的统一方法:也为STL的算法提供了统一性. 3) STL的函数对象实现了自定义数据类型的算法运算 ...

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

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

  4. C++进阶 STL(1) 第一天 [容器,算法,迭代器] string容器 vector容器 deque容器

    课程大纲 02实现基本原理 容器,算法,迭代器 教室:容器 人:元素 教室对于楼:容器 序列式容器: 容器元素在容器中的位置是由进入容器的时间和地点来决定 序列式容器 关联式容器: 教室中 按年龄排座 ...

  5. 《STL源码剖析》——第五、六:关联容器与算法

    第五章.关联容器  5.0.关联容器 标准的STL关联式容器分为set(集合)和map(映射表)两大类,以及这两大类的衍生体multiset(多键集合)和multimap(多键映射表).这些容器的底层 ...

  6. STL六大组件之——算法小小小小的解析

    参考自侯捷的<stl源码剖析> stl算法主要分为非可变序列算法(指不直接修改其所操作的容器内容的算法),可变序列算法(指可以修改它们所操作的容器内容的算法),排序算法(包括对序列进行排序 ...

  7. STL中的所有算法(70个)

    STL中的所有算法(70个)----9种类型(略有修改by crazyhacking) 参考自: http://www.cppblog.com/mzty/archive/2007/03/14/1981 ...

  8. STL 序列容器

    转自时习之 STL中大家最耳熟能详的可能就是容器,容器大致可以分为两类,序列型容器(SequenceContainer)和关联型容器(AssociativeContainer)这里介绍STL中的各种序 ...

  9. c++复习:STL之容器

    1 STL的string 1 String概念 string是STL的字符串类型,通常用来表示字符串.而在使用string之前,字符串通常是用char*表示的.string与char*都可以用来表示字 ...

随机推荐

  1. iOS 根据农历日期 获取当前的农历年份 即 干支纪年法算农历年

    前言:我国古代是用干支纪年的,近代史上提到的甲午战争.戊戌变法.辛亥革命等名词就是干支纪年.所谓干支就是十天干和十二地支的简称.天干.地支按照一定规则(单配单,双配双)可以搭配成60对,也就是一个甲子 ...

  2. ORA-28002 the password will expire

    ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;

  3. Linux安装jdk10

    1.官网下载jdk10 下载方式两种,一种是wget下载,一种是windows系统下载,然后上传到linux系统上. 2.解压到/usr/local/java mkdir /usr/local/jav ...

  4. 【Flask】Sqlalchemy 外键

    ### 外键:使用SQLAlchemy创建外键非常简单.在从表中增加一个字段,指定这个字段外键的是哪个表的哪个字段就可以了.从表中外键的字段,必须和父表的主键字段类型保持一致.示例代码如下: from ...

  5. 基于Visual c++ 2012的php扩展开发 - 环境搭建

    软件准备 Apache2.4 php-5.6.20-Win32-VC11-x86 php-5.6.20-src mysql-5.5.45-win32 vcredist_x86.exe vs2012旗舰 ...

  6. INSPIRED启示录 读书笔记 - 第23章 改进现有产品

    不是一味地添加功能 改进产品不是简单地满足个别用户的要求,也不能对用户调查的结果照单全收.能提高指标的功能才是关注的重点.应该找准方向,分析关键指标,有针对性地改进产品

  7. Bootstrap3组件--1

     目录 1. Glyphicons字体图标 2.下拉菜单 3.按钮组 4. 输入框组 5.导航 6. 导航条 7. 路径导航 1. Glyphicons字体图标 出于性能的考虑,所有图标都需要一个基类 ...

  8. 【简单dp】poj 1458 最长公共子序列【O(n^2)】【模板】

    最长公共子序列可以用在下面的问题时:给你一个字符串,请问最少还需要添加多少个字符就可以让它编程一个回文串? 解法:ans=strlen(原串)-LCS(原串,反串); Sample Input abc ...

  9. Educational Codeforces Round 15 D. Road to Post Office 数学

    D. Road to Post Office time limit per test 1 second memory limit per test 256 megabytes input standa ...

  10. Python去除字符串的空格

    Python能够找出字符串开头和末尾多余的空白. 要确保字符串末尾没有空白,可使用方法rstrip(). 还可以剔除字符串开头的空白,或同时剔除字符串两端的空白. 为此,可分别使用方法lstrip() ...