操作元素序列transform

对元素序列进行操作,把结果存储在result中,复杂度O(N)O(N)O(N),N=last1−first1N = last1-first1N=last1−first1

template <class InputIterator, class OutputIterator, class UnaryOperation>OutputIterator transform (InputIterator first1, InputIterator last1,OutputIterator result, UnaryOperation op);template <class InputIterator1, class InputIterator2,class OutputIterator, class BinaryOperation>OutputIterator transform (InputIterator1 first1, InputIterator1 last1,InputIterator2 first2, OutputIterator result,BinaryOperation binary_op);

first1last1表示输入的元素区间,result表示目标容器的位置迭代器。first2表示输入的区间,和first1的长度一样。
op定义了元素的行为:

template <class InputIterator, class OutputIterator, class UnaryOperator>OutputIterator transform (InputIterator first1, InputIterator last1,OutputIterator result, UnaryOperator op)
{while (first1 != last1) {*result = op(*first1);  // or: *result=binary_op(*first1,*first2++);++result; ++first1;}return result;
}

如果是把一个区间追加到另一个区间上,可以使用下面的方式:
尾部插入:

vector<int>result;
transform(values.begin(), values.end(),back_inserter(result),transmogrify);

头部插入:

vector<int>result;
transform(values.begin(), values.end(),back_inserter(result),transmogrify);

中间位置插入:

vector<int>values;
vector<int>resultes;transform(values.begin(), values.end(),insert(results, results.begin() + resultes.size() / 2),transmogrify);

但是,单个添加元素的效率比较低,更高效的做法应该是调用reserve提前改变容器的容量,提高插入的性能:

vector<int>values;
vector<int>resultes;
// 扩充区间
results.reserve(results.size() + values.size());transform(values.begin(), values.end(),insert(results, results.begin() + resultes.size() / 2),transmogrify);

要在算法执行过程中增大目标区间,请使用插入型迭代器,比如ostream_iterator;或者由back_inserter、front_inserter和insert返回的迭代器!!!

与排序有关的操作

常规的是sort函数,需要一个二元谓词定义比较框架,默认使用operator<。时间复杂度O(Nlog⁡N)O(N\log N)O(NlogN),不稳定的排序。

稳定排序的是stable_sort,这是归并排序的版本,但是消耗额外的空间。

partial_sort进行局部排序,[first,middle)是需要排序的区间,[middle,last)不需要排序,但是元素位置发生了变化。时间复杂度是O(Nlog⁡M)O(N\log M)O(NlogM),其中N=last−firstN=last-firstN=last−first,M=middle−firstM=middle-firstM=middle−first,不稳定的排序。

template <class RandomAccessIterator>void partial_sort (RandomAccessIterator first, RandomAccessIterator middle,RandomAccessIterator last);template <class RandomAccessIterator, class Compare>void partial_sort (RandomAccessIterator first, RandomAccessIterator middle,RandomAccessIterator last, Compare comp);

nth_element获取一个排序的区间,前n-1个小元素在first~nth里面,后面的元素在nth+1~last里面。元素的顺序都发生了变化,是不稳定的,时间复杂度时O(N)O(N)O(N)。

template <class RandomAccessIterator>void nth_element (RandomAccessIterator first, RandomAccessIterator nth,RandomAccessIterator last);
template <class RandomAccessIterator, class Compare>void nth_element (RandomAccessIterator first, RandomAccessIterator nth,RandomAccessIterator last, Compare comp);

比如该函数可以找一个区间的中间值:

    vector<int>vec{2, 1, 5, 3, 4, 9, 8, 6, 7, 0};nth_element(vec.begin(), vec.begin() + vec.size() / 2, vec.end());cout << *(vec.begin() + vec.size() / 2) << endl;

如果改成vec.begin() + per * vec.size(),其中per是个小数,那么就是求解一个前per%位置数据。

partition算法可以把满足某种条件的元素放置到区间的前部,时间复杂度是线性的,取决于比较元素的关系。

template <class ForwardIterator, class UnaryPredicate>ForwardIterator partition (ForwardIterator first,ForwardIterator last, UnaryPredicate pred);

pred是一个一元谓词,用于比较的,返回true表示需要放到区间的前部。

stable_partition是稳定版的。

复杂度从小到大排序:
partition<stable_partition<nth_element<partial_sort<sort<stable_sort

remove

remove不能从容器中删除元素,它只能把要删除的元素移动到容器的末尾,真正删除需要调用容器本身的erase函数进行操作。

STL的所有算法都不能改变容器的物理结构,只有容器的本身才可以。如果要进行删除,需要这样操作:

vector<int>vec{2, 1, 5, 3, 4, 9, 8, 6, 7, 0};
vec.erase(remove(vec.begin(), vec.end(), 6), vec.end());

STL的算法补充笔记-1相关推荐

  1. 【STL切片算法文献笔记】基于GPU并行计算的3D打印切片算法

    3D打印模型切片算法研究 文章目录 3D打印模型切片算法研究 论文介绍 前言 一.介绍 二.基于反向光线追踪的切片算法 1.反向光线追踪算法 2.快速获取切片轮廓 三.轮廓提取和NUBRS拟合优化 1 ...

  2. Data Structures with C++ Using STL Chapter 3算法概述---笔记

    <Data Structures with C++ Using STL Chapter 3算法概述---笔记>,作者:茉莉花茶,原文链接:http://www.cnblogs.com/yc ...

  3. 黑马C++笔记——STL常用算法

    STL常用算法 1.概述 STL算法主要是由头文件algorithm functional numeric组成 algorithm 是所有STL文件中最大的一个,涉及到比较.交换.查找.遍历.复制.修 ...

  4. 算法与数据结构模版(AcWing算法基础课笔记,持续更新中)

    AcWing算法基础课笔记 文章目录 AcWing算法基础课笔记 第一章 基础算法 1. 排序 快速排序: 归并排序: 2. 二分 整数二分 浮点数二分 3. 高精度 高精度加法 高精度减法 高精度乘 ...

  5. 大顶堆删除最大值_算法学习笔记(47): 二叉堆

    堆(Heap)是一类数据结构,它们拥有树状结构,且能够保证父节点比子节点大(或小).当根节点保存堆中最大值时,称为大根堆:反之,则称为小根堆. 二叉堆(Binary Heap)是最简单.常用的堆,是一 ...

  6. 基于MVS的三维重建算法学习笔记(二)— 立体视觉的几何基础总结

    基于MVS的三维重建算法学习笔记(二)- 立体视觉的几何基础总结 声明 概述 1. 常见三维数据类型 2. 三维形状的几种表达形式 3. 三维空间刚体运动 4. 李群和李代数 5. 相机标定 6. 非 ...

  7. Python最优化算法学习笔记(Gurobi)

    微信公众号:数学建模与人工智能 github地址:https://github.com/QInzhengk/Math-Model-and-Machine-Learning Python最优化算法学习笔 ...

  8. Python算法题笔记

    Python算法题笔记 这是本人在学Python和算法题时做的笔记,包含一些Python的典型写法,有用的轮子调用,希望对大家有帮助. 分为三个部分,Python笔记,算法,经典题目,其中Python ...

  9. C++ STL源码剖析 笔记

    写在前面 记录一下<C++ STL源码剖析>中的要点. 一.STL六大组件 容器(container): 各种数据结构,用于存放数据: class template 类泛型: 如vecto ...

最新文章

  1. textarea选中行删除_Vim、gvim操作花样删除
  2. 2020新版IDEA创建Web工程(包括添加Tomcat服务器、第三方jar包)
  3. php每天一题:strlen()与mb_strlen()的作用分别是什么
  4. 使用c:forEach 控制5个换行
  5. POJ1279 Art Gallery 多边形的核
  6. es6 Symbol概述
  7. python语言做法_在Python中使用设置文件的最佳做法是什么?
  8. 两个数组中对应的下标的值合成一个新的数组_剑指 offer 面试题精选图解 03 . 数组中重复的数字
  9. linux命令 剪切,linux剪切命令
  10. css+html投票系统,网上在线投票系统的设计与实现.doc
  11. 13. 如何打破白天开会、晚上加班的节奏
  12. html网页漂浮广告原理js,JS实现弹性漂浮效果的广告代码
  13. 21、人类简史-从动物到上帝(赫拉利)
  14. 包的概念与常见内置模块
  15. WorkPlus移动办公平台,助力企业随时随地“指尖办公”
  16. CSS 选择器及常用属性介绍
  17. Excel建立股票资产定价模型,寻找最佳投资组合
  18. 用纯CSS画一颗爱心
  19. 完全背包问题(动态规划)
  20. 金融科技业务的云端服务

热门文章

  1. workbench设置单元坐标系_ANSYS经典案例在Workbench中实现分享连载(三)
  2. 第10-11讲 后端
  3. ResNeXt - Aggregated Residual Transformations for Deep Neural Networks
  4. 目标检测——neck组件的学习笔记
  5. MATLAB中数组的原始索引和线性索引之间相互进行转换
  6. github下载慢怎么办,国内下载release内容的解决办法
  7. 素数判定 [2009年哈尔滨工业大学计算机研究生机试真题]
  8. 算法不会,尚能饭否之顺序表
  9. jzoj3771. 【NOI2015模拟8.15】小 Z 的烦恼
  10. 全局变量的使用【C++/Qt】