STL源码剖析 算法开篇

  • STL源码剖析 算法章节 算法总览_CHYabc123456hh的博客-CSDN博客

质变算法

  • 质变算法 - 会改变操作对象的数值,比如互换、替换、填写、删除、排列组合、分隔、随机重排、排序等
#include <iostream>
#include <vector>int main(){int ia[] = {22,30,20,34,45,64,34,56,75,34};std::vector<int>iv(ia,ia+(sizeof (ia) / sizeof (int)));for (int i = 0; i < iv.size(); ++i) {std::cout << iv[i] << ' ';}std::cout << std::endl;std::cout << iv.size() << ' ';//错误的 sort属于质变算法 不应该使用const迭代器
//    std::vector<int>::const_iterator cit1 = iv.begin();
//    std::vector<int>::const_iterator cit2 = iv.end();
//    std::sort(iv.begin(),iv.end());std::vector<int>::iterator cit1 = iv.begin();std::vector<int>::iterator cit2 = iv.end();std::sort(cit1,cit2);}

非质变算法

  • 运算过程中不会改变 迭代器标示出来的区间上的元素内容。查找(find)、匹配(find_if)、计数(count)、巡防(for_each)、比较(equal)、寻找极值(max、min)等
  • 但是如果在迭代区间上应用一个会改变元素内容的仿函数,也会改变元素的数值
#include <iostream>
#include <vector>template<class T>
struct plus2{void operator()(T& x){x += 2;}
};//template <class T>
void plus3_fun(int& x){x += 3;
//    std::cout << x << " ";
}int main(){int ia[] = {22,30,20,34,45,64,34,56,75,34};std::vector<int>iv(ia,ia+(sizeof (ia) / sizeof (int)));for (int i : iv) {std::cout << i << ' ';}std::cout << std::endl;std::cout << iv.size() << ' ';std::cout << std::endl;//    std::for_each(iv.begin(),iv.end(),plus2<int>());std::for_each(iv.begin(),iv.end(), plus3_fun);for (int i : iv) {std::cout << i << ' ';}
}
  • 算法的泛型话的主要目的是为了,抽象化操作对象的型别、操作对象的标示法和区间目标的移动行为,整个算法也就在一个抽象层面了
  • 以简单的循环查找为例,写一个find函数
#include<iostream>int * find(int* arrayHead,int arraySize,int value){int i = 0;for (; i < arraySize; ++i) {if (arrayHead[i] == value){break;}}return &(arrayHead[i]);
}
int main(){int array[] = {11,13,34,56,77,8,945,56};int *ptr = nullptr;std::cout << sizeof(array) << std::endl;ptr = find(array,8,13);std::cout << *ptr;
}
  • 设定end()即为指向array尾端以外的任何位置,主要目的是为了和其他array指针进行比较,但是不能提领其数值
#include<iostream>int * find(int* arrayHead,int arraySize,int value){int i = 0;for (; i < arraySize; ++i) {if (arrayHead[i] == value){break;}}return &(arrayHead[i]);
}
int main(){const int size = 8;int array[] = {11,13,34,56,77,8,945,56};int *end = array + size;//最后一个元素的位置int *ptr = nullptr;std::cout << sizeof(array)/sizeof(int) << std::endl;ptr = find(array,sizeof(array)/sizeof(int),13);if (ptr == end){std::cout << "Not found!" << std::endl;} else{std::cout << *ptr << " found!" << std::endl;}
}
  • 上述find()暴露了容器太多的细节,且太限定于特定的容器。为了让find函数适配于所有类型的容器,其操作需要更进一步的抽象化
int * find(int* begin,int* end,int value){while (begin != end && *begin != value){++begin;}return begin;
}
  • 上述函数适用于[begin() , end) (不包含end指针,end是指最后元素的下一个位置)
#include<iostream>int * find(int* begin,int* end,int value){while (begin != end && *begin != value){++begin;}return begin;
}int main(){const int size = 8;int array[] = {11,13,34,56,77,8,945,56};int *end = array + size;//最后一个元素的位置int*ptr = find(array,end,13);if (ptr == end){std::cout << "not found" << std::endl;} elsestd::cout << *ptr << " found" << std::endl;//也可以适用于查找特定的子区间int* ip = find(array+2,array+5,3);
}
  • 更进一步将其修改为模板的形式
template<typename T> //关键词typename 也可以使用class替代
T * find(T* begin,T* end,T value){//以下用到了operator!= operator* operator++//需要操作符重载while (begin != end && *begin != value){++begin;}//以下操作 会引发copy行为return begin;
}
  • 数值的传递可由 pass by value改为pass by reference to const 主要目的是出于不是基本数据类型,对象很大,传递成本很高,使用引用传递可以避免这些成本
  • 更进一步 超出指针的思维局限,比如find函数针对的是list,对于指针进行++运算不会将指针指向下一个串行节点,但是如果设计一个class,拥有原生指针的行为,并且对其进行++操作可以指向list的下一个节点,这里指定的是迭代器,其本质是一种智能指针,也就是行为类似指针的对象。
template <class Iterator,class T>
Iterator find(Iterator begin,Iterator end,const T& value){while (begin != end && *begin!=value){++begin;}return begin;
}    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/446227.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 随机数一维数组

题目1 创建一个长度为6的int型数组&#xff0c;要求数组元素的值都在1-30之间&#xff0c;且是随机赋值。同时&#xff0c;要求元素的值各不相同 代码1 public class ArrayTest2 {public static void main(String[] args) {generateArray(6);}public static void generateAr…

STL源码剖析 数值算法 accumulate | adjacent_difference | inner_product | partial_sum | power | itoa

//版本1 template <class InputIterator,class T> T accumulate(InputIterator first,InputIterator last,T init){for(;first ! last; first){init *first; //将每个元素数值累加到init身上}return init; }//版本2 template <class InputIterator,class T,class Bin…

python官网网址是什么意思_大家都是怎么部署python网站的?

flaskgunicornnginx 作者&#xff1a;Python小白 链接&#xff1a;centos下通过gunicorn和nginx部署Flask项目 - Python小白的文章 - 知乎专栏 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 之前用Flask写了个解析Tu…

java回形数矩阵

题目 从键盘输入一个整数&#xff08;1~20&#xff09; 则以该数字为矩阵的大小&#xff0c;把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。例如&#xff1a; 输入数字2&#xff0c;则程序输出&#xff1a; 1 2 4 3 输入数字3&#xff0c;则程序输出&#xff1a; 1 2 3 8…

STL源码剖析 基本算法 equal | fill | iter_awap | lexicographical_compare | max | min | swap |mismatch

Equal 两个序列在[first,last)区间内相等&#xff0c;equal()返回true。以第一个序列作为基准&#xff0c;如果第二序列元素多不予考虑&#xff0c;如果要保证两个序列完全相等需要比较元素的个数 if(vec1.size() vec2.size() && equal(vec1.begin(),vec1.end(),vec2…

svm分类器训练详细步骤_「五分钟机器学习」向量支持机SVM——学霸中的战斗机...

大家好&#xff0c;我是爱讲故事的某某某。 欢迎来到今天的【五分钟机器学习】专栏内容 --《向量支持机SVM》 今天的内容将详细介绍SVM这个算法的训练过程以及他的主要优缺点&#xff0c;还没有看过的小伙伴欢迎去补番&#xff1a;【五分钟机器学习】向量支持机SVM——学霸中的…

java一维数组的复制

题目 使用简单数组(1)创建一个名为ArrayTest的类&#xff0c;在main()方法中声明array1和array2两个变量&#xff0c;他们是int[]类型的数组。(2)使用大括号{}&#xff0c;把array1初始化为8个素数&#xff1a;2,3,5,7,11,13,17,19。(3)显示array1的内容。(4)赋值array2变量等…

STL源码剖析 数值算法 copy 算法

copy复制操作&#xff0c;其操作通过使用assignment operator 。针对使用trivial assignment operator的元素型别可以直接使用内存直接复制行为(使用C函数 memove或者memcpy)节约时间。还可以通过函数重载(function overloading)、型别特性(type traits)、偏特化(partial speci…

python输入数字成数组_python – Numpy:将数值插入数组的最快方法,使得数组按顺序排列...

假设我有一个数组my_array和一个奇异值my_val. (请注意,my_array始终排序). my_array np.array([1, 2, 3, 4, 5]) my_val 1.5 因为my_val是1.5,我想把它放在1和2之间,给我数组[1,1.5,2,3,4,5]. 我的问题是&#xff1a;当my_array任意增大时,生成有序输出数组的最快方式(即以微…

java 一维数组的反转

代码 public class ReverseArray {public static void main(String[] args) {String[] str {"AA", "BB", "CC", "DD"};System.out.println(Arrays.toString(str));reverse1(str);System.out.println(Arrays.toString(str));reverse2…

STL源码剖析 数值算法 copy_backward 算法

copy_backward 时间技巧和copy类似主要是将[first&#xff0c;last)区间范围内的元素按照逆行方向复制到以result-1为起点&#xff0c;方向同样是逆行的区间上返回的迭代器的类型是result - (last - first)copy_backward支持的类型必须是BidirectionalIterators &#xff0c;才…

java线性查找和二分查找

线性查找 package lesson.l7_array;/*** Illustration** author DengQing* version 1.0* datetime 2022/6/23 14:19* function 线性查找*/ public class LineSearch {public static void main(String[] args) {String[]str{"AA","BB","CC"};boo…

python开发web项目_Django2:Web项目开发入门笔记(20)

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 这一篇教程&#xff0c;我们一起来了解如何在CentOS系统中将Django2的Web项目部署到Nginx服务器。 CentOS系统虽然和Ubuntu系统都是Linux系统&#xff0c;但是环境搭建和部署过程还是有一些区别。 整个流程分为几个部分&#xff1…

STL源码剖析 Set相关算法 并集 set_union|交集 set_intersection|差集 set_difference |对称差集 set_symmetric_difference

注意事项 四种相关算法&#xff1a;并集、交集、差集、对称差集本章的四个算法要求元素不可以重复并且经过了排序底层接受STL的set/multiset容器作为输入空间不接受底层为hash_set和hash_multiset两种容器 并集 set_union s1 U s2考虑到s1 和 s2中每个元素都不唯一&#xff0…

python sqlserver 数据操作_python对Excel数据进行读写操作

python对Excel数据进行读写操作将学习到的基础操作记录在这里&#xff0c;便与复习查看1.python读取Excel工作簿、工作表import xlrd # 读取工作簿 wbxlrd.open_workbook(招生表.xls) # 读取工作簿下所有的工作表 wswb.sheets() # 读取工作簿下所有工作表名称 wsnamewb.sheet_n…

Arrays数组工具类

介绍 代码 package lesson.l8_arrays;import java.util.Arrays;/*** Illustration** author DengQing* version 1.0* datetime 2022/6/23 16:53* function Arrays数组工具类*/ public class ArraysUtil {public static void main(String[] args) {int[] arr1 new int[]{1, 12…

通过解析URL实现通过Wifi的用户查找

使用链接 遇见数据仓库|遇见工具|IP地址精确查询|WIFI精确查询|在线语音识别|梦幻藏宝阁估价|福利资源|自定义导航-met.redhttps://sina.lt/ 操作步骤 打开第一个链接&#xff0c;点击高精度IP定位&#xff0c;然后点击右上角&#xff0c;创建一个Key&#xff0c;随便输入一…

anaconda中怎么sh_【好工具】 深度学习炼丹,你怎么能少了这款工具!JupyterLab 远程访问指南...

欢迎来到【好工具】专栏&#xff0c;本次我们给介绍一款可以进行远程深度学习炼丹的工具 JupyterLab 及其配置流程&#xff0c;帮助读者在本地进行调试&#xff0c;Max 开发效率。作者 & 编辑 | Leong导言不知道读者们有没有发现&#xff0c;如果你用 Anaconda 中的 Notebo…

java 类和对象 属性和行为 成员变量和局部变量

概念 使用 案例 public class PersonText {public static void main(String[] args) {Person person new Person();person.name "dq";person.age 11;person.eat("番茄炒蛋");} }class Person {/*** 姓名*/String name;/*** 年龄*/Integer age;/*** 方…

STL源码剖析 数值算法 heap算法

算法 adjacent_findcountcount_iffindfind_iffind_endfor_eachgenerategenerate_nincludesmax_elementmergemin_elementpartitionremoveremoveremove_copyremove_ifremove_copy_ifreplacereplace_copyreplace_ifreplace_copy_ifreversereverse_copyrotaterotate_copysearchsea…