c/c++ 通用的(泛型)算法 之 只读算法,写算法,排序算法
通用的(泛型)算法 之 只读算法,写算法,排序算法
只读算法:
| 函数名 | 功能描述 |
|---|---|
| accumulate | 求容器里元素的和 |
| equal | 比较2个容器里的元素 |
写算法
| 函数名 | 功能描述 |
|---|---|
| fill | 用给定值,覆盖给定的范围的元素 |
| fill_n | 用给定值,覆盖给定开始位置后的,n个元素变 |
| back_inserter | 在容器末尾插入元素 |
| copy | 把容器1指定范围里的值拷贝给容器2,并返回指向容器2最后一个元素的下个元素 |
| replace | 用某个值替换掉给定范围的某个值 |
| replace_copy | 用某个值替换掉给定范围的某个值,但不改变原来的容器,把结果给新的容器 |
排序算法
| 函数名 | 功能描述 |
|---|---|
| sort | 从小到大排序 |
| unique | 把不重复的元素放在容器的前面,重复的放在后面,并返回重复部分的第一个位置 |
include <iostream>
#include <array>
#include <vector>
#include <algorithm>
#include <list>
#include <deque>
#include <numeric>
#include <forward_list>
using namespace std;
int main(){
//只读算法
//1,求容器里元素的和
/*
forward_list<int> fl{1,2,3,4,5};
//第三个参数为sum的初始值
int sum = accumulate(fl.cbegin(),fl.cend(),0);
cout << sum << endl;
vector<string> svec{"aa","bb","cc"};
string str = accumulate(svec.cbegin(),svec.cend(),string(""));
//错误:const char*上没有定义+运算符
//string err = accumulate(svec.cbegin(),svec.cend(),"");
cout << str << endl;
*/
//2,比较2个容器里的元素
//如果把svec里放的是const char*,执行结果和string一样
/*
vector<string> svec{"aa","bb","cc","dd"};
list<const char*> lc{"bb","cc"};
//头2个参数为第一个容器的区间,第三个参数为第二个容器的首元素
auto result = equal(svec.cbegin()+1,svec.cend()-1, lc.cbegin());
cout << result << endl;
*/
//写算法
//1,填充fill算法
/*
array<int, 6> ar{1,2,3,4,5,6};
cout << ar.size() << endl;
//vector<int> ar{1,2,3,4,5};
//把指定范围内的值变为9
fill(ar.begin(),ar.begin() + ar.size()/2,9);
for(auto const &s : ar){
cout << s << " ";
}
cout << endl;
cout << ar.size() << endl;
*/
//2,填充fill_n算法
/*
int ir[] = {1,2,3,4,5,6};
//指定位置开始,后3个元素变为9
fill_n(begin(ir)+1,3,9);
for(auto const &s : ir){
cout << s << " ";
}
cout << endl;
*/
//3,插入迭代器back_inserter
//在容器末尾插入元素
/*
vector<int> ivec{1,0};
auto it = back_inserter(ivec);
fill_n(it,3,99);
for(auto const &s : ivec){
cout << s << " ";
}
cout << endl;//1,0,99,99,99
*/
//4,copy算法
/*
int a1[] = {1,2,3,4,5};
int a2[sizeof(a1) / sizeof(*a1)];
//把a1指定范围里的值拷贝给a2,ret指向a2最后一个元素的下个元素
auto ret = copy(begin(a1), end(a1), a2);
//ret-1为数组a2的最后一个元素的地址
*(ret-1) = 100;
for(auto const &s : a2){
cout << s << " ";
}
cout << endl;
//ret和end(a2)指向同一个地址
if(ret == end(a2)){
cout << "true" << endl;
}
else{
cout << "false" << endl;
}
*/
//5,replace算法
/*
list<int> il{1,2,2,2,5};
//把范围内的2替换成23
replace(il.begin(), il.end(),2,43);
for(auto const &s : il){
cout << s << " ";
}
cout << endl;
list<int> ila{1,2,2,2,5};
vector<int> ivec;
replace_copy(ila.begin(),ila.end(),back_inserter(ivec),2,23);
for(auto const &s : ivec){
cout << s << " ";
}
cout << endl;
//不改变ila
for(auto const &s : ila){
cout << s << " ";
}
cout << endl;
*/
//重新排列算法(链表list和forward_list不支持sort)
//实现删除重复的元素
deque<string> sli =
{"one","two","one","three","two","four","two"};
for(auto const &s : sli){
cout << s << " ";
}
cout << endl;
//从小到大排序
sort(sli.begin(),sli.end());
for(auto const &s : sli){
cout << s << " ";
}
cout << endl;
//把有重复的元素放到末尾,并返回不重复元素的下一位置
auto end_unique = unique(sli.begin(),sli.end());
//删除掉重复的元素
sli.erase(end_unique, sli.end());
for(auto const &s : sli){
cout << s << " ";
}
cout << endl;
cout << "size: " << sli.size() << endl;//size: 4
}
c/c++ 学习互助QQ群:877684253
本人微信:xiaoshitou5854
c/c++ 通用的(泛型)算法 之 只读算法,写算法,排序算法的更多相关文章
- C++ Primer : 第十章 : 泛型算法 之 只读、写和排序算法
大多数算法都定义在<algorithm>头文件里,而标准库还在头文件<numeric>里定义了一组数值泛型算法,比如accumulate. ● find算法,算法接受一对迭代 ...
- 《算法4》2.1 - 选择排序算法(Selection Sort), Python实现
选择排序算法(Selection Sort)是排序算法的一种初级算法.虽然比较简单,但是基础,理解了有助于后面学习更高深算法,勿以勿小而不为. 排序算法的语言描述: 给定一组物体,根据他们的某种可量化 ...
- JavaScript 数据结构与算法之美 - 十大经典排序算法汇总(图文并茂)
1. 前言 算法为王. 想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手:只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 ...
- JS写的排序算法演示
看到网上有老外写的,就拿起自已之前完成的jmgraph画图组件也写了一个.想了解jmgraph的请移步:https://github.com/jiamao/jmgraph 当前演示请查看:http:/ ...
- [读书笔记]算法(Sedgewick著)·第二章.初级排序算法
本章开始学习排序算法 1.初级排序算法 先从选择排序和插入排序这两个简单的算法开始学习排序算法.选择排序就是依次找到当前数组中最小的元素,将其和第一个元素交换位置,直到整个数组有序. public s ...
- 《算法导论》读书笔记之排序算法—Merge Sort 归并排序算法
自从打ACM以来也算是用归并排序了好久,现在就写一篇博客来介绍一下这个算法吧 :) 图片来自维基百科,显示了完整的归并排序过程.例如数组{38, 27, 43, 3, 9, 82, 10}. 在算法导 ...
- java算法03 - 常用的8种排序算法
Java常用的八种排序算法: 插入排序 - 直接插入排序 每次将待排序的记录按照关键字的大小,插入到前面已经排好序的记录的适当位置.直到全部记录插入完成. 代码实现 /** * 直接插入排序 O(n^ ...
- [直观学习排序算法] 视觉直观感受若干常用排序算法 以及 iOS 资料
http://www.zhfish.net/?s=点击范围 1 快速排序 介绍: 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则 ...
- Java数据结构和算法(三):常用排序算法与经典题型
常用的八种排序算法 1.直接插入排序 我们经常会到这样一类排序问题:把新的数据插入到已经排好的数据列中.将第一个数和第二个数排序,然后构成一个有序序列将第三个数插入进去,构成一个新的有序序列.对第四个 ...
- [answerer的算法课堂]简单描述4种排序算法(C语言实现)
[answerer的算法课堂]简单描述4种排序算法(C语言实现) 这是我第一次写文章,想要记录自己的学习生活,写得不好请包涵or指导,本来想一口气写好多种,后来发现,写太多的话反而可读性不强,而且,我 ...
随机推荐
- JavaScript基础——深入学习async/await
本文由云+社区发表 本篇文章,小编将和大家一起学习异步编程的未来--async/await,它会打破你对上篇文章Promise的认知,竟然异步代码还能这么写! 但是别太得意,你需要深入理解Promis ...
- Java设计模式学习记录-模板方法模式
前言 模板方法模式,定义一个操作中算法的骨架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤. 模板方法模式 概念介绍 模板方法模式,其实是很好理解的,具体 ...
- Python循环结构用法
本文介绍python中的while循环.for循环.在python中for可以用于循环,也可用于另一种近亲的列表解析,列表解析是python中非常重要的特性,详细内容见后面的文章. 一般来说,pyth ...
- MySQL优化(2)--------常用优化
前言 之前已经简单介绍了MySQL的优化步骤,那么接下来自然而是就是常用的SQL优化,比如inseer.group by等常用SQL的优化,会涉及SQL语句内部细节(这正是我缺乏的).最后希望自己能记 ...
- Runtime详解(下)
Runtime应用 1.Runtime 交换方法 应用场景:当第三方框架或者系统原生方法功能不能满足我们的时候,我们可以在保持系统原有功能的基础上,添加额外的功能. 需求:加载一张图片直接用系统的[U ...
- SQL语句害死人
最近在弄Android的SQLite,觉得其语法是在难搞~ 在这里把一些正确规范的实例贴出来,供参考 ';
- linux添加字体
执行命令发现输入命令查看字体列表是提示命令无效: 如上图可以看出,不仅没有中文字体,连字体库都没有,那么接下来就记录一下在Linux CentOS 7中如何安装字体库以及中文字体. 安装字体库 在Ce ...
- C#隐藏与显示系统任务栏和开始菜单栏按钮
隐藏与显示系统任务栏和开始菜单栏按钮:直接上代码: private const int SW_HIDE = 0; //隐藏 private const int SW_REST ...
- C#-变量类型(值类型、引用类型)
第一次发这样的笔记呢! 这个是在再读基础的时候感觉自己理解的东西吧 变量的类型差异在数据的存储方式不一样,值类型是变量本身直接存储数据,另一个则是存储实际变量的引用, 值类型:都是存储在栈中的,都是直 ...
- mybatis_14二级缓存
原理: 同一级缓存原理相似,在sqlsession3不执行增删改的情况下,sqlsession2的查询结果会直接调用sqlsession1的查询结果,具体细节如下: 使用: 开启二级缓存总开关 U ...