STL理论基础、容器、迭代器、算法
一、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优点:
- STL是C++的一部分,因此不用额外安装什么,它被内建在你的编译器之内。
- STL的一个重要特点是数据结构和算法的分离。尽管这是个简单的概念,但是这种分离确实使得STL变得非常通用。例如,在STL的vector容器中,可以放入元素、基础数据类型变量、元素的地址;STL的sort()函数可以用来操作vector,list等容器。
- 程序员可以不用思考STL具体的实现过程,只要能够熟练使用STL就OK了。这样他们就可以把精力放在程序开发的别的方面。
- 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理论基础、容器、迭代器、算法的更多相关文章
- C++ STL vector容器学习
STL(Standard Template Library)标准模板库是C++最重要的组成部分,它提供了一组表示容器.迭代器.函数对象和算法的模板.其中容器是存储类型相同的数据的结构(如vector, ...
- STL的容器算法迭代器的设计理念
1) STL的容器通过类模板技术,实现数据类型和容器模型的分离. 2) STL的迭代器技术实现了遍历容器的统一方法:也为STL的算法提供了统一性. 3) STL的函数对象实现了自定义数据类型的算法运算 ...
- stl之容器、迭代器、算法几者之间的关系
转自:https://blog.csdn.net/bobodem/article/details/49386131 stl包括容器.迭代器和算法: 容器 用于管理一些相关的数据类型.每种容器都有它的优 ...
- C++进阶 STL(1) 第一天 [容器,算法,迭代器] string容器 vector容器 deque容器
课程大纲 02实现基本原理 容器,算法,迭代器 教室:容器 人:元素 教室对于楼:容器 序列式容器: 容器元素在容器中的位置是由进入容器的时间和地点来决定 序列式容器 关联式容器: 教室中 按年龄排座 ...
- 《STL源码剖析》——第五、六:关联容器与算法
第五章.关联容器 5.0.关联容器 标准的STL关联式容器分为set(集合)和map(映射表)两大类,以及这两大类的衍生体multiset(多键集合)和multimap(多键映射表).这些容器的底层 ...
- STL六大组件之——算法小小小小的解析
参考自侯捷的<stl源码剖析> stl算法主要分为非可变序列算法(指不直接修改其所操作的容器内容的算法),可变序列算法(指可以修改它们所操作的容器内容的算法),排序算法(包括对序列进行排序 ...
- STL中的所有算法(70个)
STL中的所有算法(70个)----9种类型(略有修改by crazyhacking) 参考自: http://www.cppblog.com/mzty/archive/2007/03/14/1981 ...
- STL 序列容器
转自时习之 STL中大家最耳熟能详的可能就是容器,容器大致可以分为两类,序列型容器(SequenceContainer)和关联型容器(AssociativeContainer)这里介绍STL中的各种序 ...
- c++复习:STL之容器
1 STL的string 1 String概念 string是STL的字符串类型,通常用来表示字符串.而在使用string之前,字符串通常是用char*表示的.string与char*都可以用来表示字 ...
随机推荐
- iOS NSCoding 的学习 和 使用
起初接触的轻量级 物理存储 方式 是 plist 可以存储 系统级别的 字典 数组 但是不能存储自定义的对象类 那会 用自定义对象做存储的 需求也不大 主要 是 还没建立面向对象意识,会的也少. ...
- Linux 邮件服务搭建
Linux 邮件服务搭建 邮件服务针对,在大型企业使用的比较多,一般小型企业都会买一些邮件服务,或者使用一些免费的邮件服务,达到我们使用的需求,并且不需要自己维护,下面我就来简单安装一下两个邮箱的案例 ...
- 跨平台移动开发 Xuijs超轻量级的框架 Dom与Event简洁代码实现文本展开收起
Dom与Event简洁代码实现文本展开收起 Xuijs超轻量级的框架 Dom与Event实现文本展开收起 效果图 示例代码 <!DOCTYPE html PUBLIC "-//W3C/ ...
- iOS_XML与JSON解析
XML与JSON简介 XML 可扩展标记语言 用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言 易读性高,编码手写难度小,数据量 ...
- QFile操作文件
1.构造QFile对象 QFile file("C:\a.txt"); 或者 QFile *file = new QFile("C:\a.txt"); 2.设置 ...
- INSPIRED启示录 读书笔记 - 第10章 管理上司
十条经验 1.为项目波动做好准备:用项目波动代指让你心烦意乱的各种返工.计划变更.不要企图消灭项目波动,但是可以尽量降低其负面影响.方法是提高警惕,记录工作进度,掌握项目波动的规律,寻找对策.制订项目 ...
- Vue.js学习笔记 第三篇 条件渲染
条件选择 条件选择的用法和其他语言类似,一个例子就能解决所有问题 <!DOCTYPE html> <html> <head> <meta charset=&q ...
- Windows10提示“没有权限使用网络资源”的解决方案
1.点击“开始→运行”,在“运行”对话框中输入“GPEDIT.MSC”,打开组策略编辑器 2.依次选择“计算机配置→Windows设置→安全设置→本地策略→用户权利分配” 3.双击“拒绝从网络访问这台 ...
- Docker 容器监控平台-Weave Scope
官网地址:https://www.weave.works/oss/scope/ 安装 执行如下脚本安装运行 Weave Scope. curl -L git.io/scope -o /usr/loca ...
- unbunto关闭触摸屏
sudo rmmod psmouse 这个是禁用的 sudo modprobe psmouse 这个是启用的