01--STL泛型编程了解
开始学习侯捷老师的课程了~~
一:六大组件关系
容器(Container)
算法(Algorithm)
迭代器(Iterator)
仿函数(Function object)
适配器(Adaptor)
空间配制器(allocator)
二:组件调用
#include <vector>
#include <algorithm>
#include <functional>
#include <iostream>
#include <cstdlib> using namespace std; //https://www.cnblogs.com/freeopen/p/5482962.html int main01()
{
int ia[] = { , , , , , }; //1.容器 2.分配器
//分配器可以不写,会有默认,但是两者要一致。<>是模板函数
//前闭后开区间??[)
vector<int, allocator<int>> vi(ia, ia + ); //设置初值 //3.算法 4.迭代器 5.仿函数 6.适配器
//找到大于等于40数
cout << count_if(vi.begin(), vi.end(), //count是计算数量
not1(bind2nd(less <int>(), )))<<endl; //_if是指含有条件,
//less <int>()函数小于
//bind2nd绑定第二个参数40.小于40
//not1否,不小于40
//后面跟上小于40的条件 //遍历
vector<int>::iterator iter = vi.begin();
for (; iter != vi.end();++iter)
{
cout << *iter << " ";
} //C11
/*
for(decl:col1){
....
}
*/
cout << endl;
for (int i : {,,,,,,,})
{
cout << i << " ";
} //引用操作
cout << endl;
for (auto& elem : vi) //auto让编译器自己辨别(不太好)等号从右向左,先知道返回类型,再确定auto int
{
elem *= ;
} cout << endl;
for (auto elem : vi)
{
cout << elem << " ";
} system("pause");
return ;
}
补充1:前闭后开区间
默认是 .begin()找到第一个元素,泛型指针指向他 .end()找到的不是最后一个元素,而是最后一个元素的下一个元素。不允许*(c.end())会溢出
三:使用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.序列式容器:vector、deque、list
每个元素都有固定位置--取决于插入时机和地点,和元素值无关。
2.关联式容器:set、multiset、map、multimap
元素位置取决于特定的排序准则,和插入顺序无关
(二)容器描述
五:迭代器
几乎STL提供的所有算法都是通过迭代器存取元素序列进行工作的,每一个容器都定义了其本身所专有的迭代器,用以存取容器中的元素。
迭代器部分主要由头文件<utility>,<iterator>和<memory>组成。
<utility>是一个很小的头文件,它包括了贯穿使用在STL中的几个模板的声明,
<iterator>中提供了迭代器使用的许多方法,而对于<memory>的描述则十分的困难,它以不同寻常的方式为容器中的元素分配存储空间,同时也为某些算法执行期间产生的临时对象提供机制,
<memory>中的主要部分是模板类allocator,它负责产生所有容器中的默认分配器。
六:算法
STL提供了大约100个实现算法的模版函数,比如算法for_each将为指定序列中的每一个元素调用指定的函数,stable_sort以你所指定的规则对序列进行稳定性排序等等。这样一来,只要熟悉了STL之后,许多代码可以被大大的化简,只需要通过调用一两个算法模板,就可以完成所需要的功能并大大地提升效率。
算法部分主要由头文件<algorithm>,<numeric>和<functional>组成。
<algorithm>是所有STL头文件中最大的一个(尽管它很好理解),它是由一大堆模版函数组成的,可以认为每个函数在很大程度上都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。
<numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。
<functional>中则定义了一些模板类,用以声明函数对象。
01--STL泛型编程了解的更多相关文章
- C++ STL泛型编程——在ACM中的运用
学习过C++的朋友们应该对STL和泛型编程这两个名词不会陌生.两者之间的关系不言而喻,泛型编程的思想促使了STL的诞生,而STL则很好地体现了泛型编程这种思想.这次想简单说一下STL在ACM中的一些应 ...
- C++ -- STL泛型编程(一)之vector
STL提供三种组件:容器,迭代器,算法,它们都支持泛型程序设计标准容器有两类:顺序容器和关联容器. 顺序容器(vector,list,deque,string等)是一系列元素的有序组合. 关联容器(s ...
- C++ -- STL泛型编程(二)之set
set集合容器实现了红黑树的平衡二叉检索树的数据结构,在插入元素时候它会自动调整二叉树的排列,把元素放在适当的位置,以确保每个子树根节点的键值都大于左子树的所有节点的键值,而小于右子树的所有节点的键值 ...
- STL——泛型编程
1.指针的算术运算 对于一个存储int数据的vector,我们要查找某值是否存在于其中,采用下标操作的做法如下: int* find(const vector<int> &vec, ...
- [GeekBand] STL与泛型编程(1)
在C++语法的学习过程中,我们已经对模板有了基本的了解.泛型编程就是以模板为工具的.泛化的编程思想.本篇文章介绍了一些在之前的文章中没有涉及到的一些模板知识.泛型编程知识和几种容器.关于模板的一些重复 ...
- 泛型编程、STL的概念、STL模板思想及其六大组件的关系,以及泛型编程(GP)、STL、面向对象编程(OOP)、C++之间的关系
2013-08-11 10:46:39 介绍STL模板的书,有两本比较经典: 一本是<Generic Programming and the STL>,中文翻译为<泛型编程与STL& ...
- STL之父Stepanov谈泛型编程的发展史
这是一篇Dr. Dobb's Journal对STL之父stepanov的采访.文中数次提到STL的基本思想.语言的特性.编程的一些根本问题等,非常精彩.这篇文章让我想去拜读下stepanov的大作& ...
- [GeekBand] STL与泛型编程(2)
本篇文章在上一篇文章的基础上进一步介绍一些常用的容器以及STL的一些深入知识. 一. Stack和Queue 栈和队列是非常常用的两种数据结构,由deque适配而来.关于数据结构的知识这里就不在介绍了 ...
- 自己动手实现STL 01:内存配置器的实现(stl_alloc.h)
一.前言 在STL中,容器是其中的重中之重,基本的STL中的算法,仿函数等都是围绕着容器实现的功能.而,内存配置器,是容器的实现的基础.所以,我第一次要去编写便是内存配置器的实现.在STL中,内存配置 ...
- [GeekBand] STL与泛型编程(3)
本篇文章主要介绍泛型算法中的变易.排序.数值算法. 一. 变易算法 所谓变易算法是指那些改变容器中的对象的操作. 1.1 copy组 template <class InputIterator, ...
随机推荐
- BZOJ2616 SPOJ PERIODNI(笛卡尔树+树形dp)
考虑建一棵小根堆笛卡尔树,即每次在当前区间中找到最小值,以最小值为界分割区间,由当前最小值所在位置向两边区间最小值所在位置连边,递归建树.那么该笛卡尔树中的一棵子树对应序列的一个连续区间,且根的权值是 ...
- bzoj 2761: [JLOI2011]不重复数字 (map||Treap)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2761 思路: map标记 实现代码: #include<bits/stdc++.h&g ...
- PHP 公共方法分享180628
查看php 类的详情:方法.常量.属性( type(new \Illuminate\Http\Request());) /** * fixme 打印类详情 * @param $class object ...
- Atcoder | AT2665 【Moderate Differences】
又是一道思路特别清奇的题qwq...(瞪了一上午才发现O(1)的结论...差点还想用O(n)解决) 问题可以转化为是否能够由\(f_{1}=a\)通过\(\pm x \in[c,d]\)得到\(f_{ ...
- emwin之自绘制 BUTTON 图形的一些问题
@2018-11-8 [小记] [需求] 官方只提供圆角矩形图形,其他图形及颜色需求则要自己实现 [注意] 通过回调函数自实现的图形绘制存在该回调函数一直被调用的现象,而非像窗口回调函数中 BUTTO ...
- mysql truncate 、delete与drop区别
相同点: 1.truncate和不带where子句的delete.以及drop都会删除表内的数据. 2.drop.truncate都是DDL语句(数据定义语言),执行后会自动提交. 不同点: trun ...
- centos7使用yum安装zabbix3.4
应用环境: 关于ZABBIX: zabbix一开强大的开源监控工具,同类型还有nagios,ganglia,cacti等监控工具,通过过去一年Google趋势就知道zabbix全球的相对热度: ...
- centos7破解安装confluence5.9.11
应用环境:Confluence是一个专业的企业知识管理与协同软件,也可以用于构建企业wiki.通过它可以实现团队成员之间的协作和知识共享. 安装环境:centos7.3 Java环境 1.7.0_79 ...
- Python3 与 C# 并发编程之~进程先导篇
在线预览:http://github.lesschina.com/python/base/concurrency/1.并发编程-进程先导篇.html Python3 与 C# 并发编程之- 进程篇 ...
- linux复制文件到一个不存在的文件夹
复制文件到一个不存在的文件夹时,会报错 cp -f aaa /home/admin/.m2/cp: 无法创建普通文件"/home/admin/.m2/": 是一个目录 解决的方式: ...