STL基础--算法(修改数据的算法)
修改元素的算法
- copy, move, transform, swap, fill, replace, remove
vector<int> vec = {9,60,70,8,45,87,90}; // 7 items
vector<int> vec2 = {0,0,0,0,0,0,0,0,0,0,0}; // 11 items
vector<int>::iterator itr, itr2;
pair<vector<int>::iterator, vector<int>::iterator> pair_of_itr;
1 拷贝
copy(vec.begin(), vec.end(), // Source
vec2.begin()); // Destination
copy_if(vec.begin(), vec.end(), // Source
vec2.begin(), // Destination
[](int x){ return x>80;}); // Condition
// vec2: {87, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0}
copy_n(vec.begin(), 4, vec2.begin());
// vec2: {9, 60, 70, 8, 0, 0, 0, 0, 0, 0, 0}
copy_backward(vec.begin(), vec.end(), // Source
vec2.end()); // Destination
// vec2: {0, 0, 0, 0, 9, 60, 70, 8, 45, 87, 90}
2 移动
vector<string> vec = {"apple", "orange", "pear", "grape"}; // 4 items
vector<string> vec2 = {"", "", "", "", "", ""}; // 6 items
move(vec.begin(), vec.end(), vec2.begin());
// vec: {"", "", "", ""} // Undefined
// vec2: {"apple", "orange", "pear", "grape", "", ""};
//
// 如果元素类型定义了移动语义,元素会移动过去
// 否则拷贝,相当于是copy().
move_backward(vec.begin(), vec.end(), vec2.end());
// vec2: {"", "", "apple", "orange", "pear", "grape"};
vector<int> vec = {9,60,70,8,45,87,90}; // 7 items
vector<int> vec2 = {9,60,70,8,45,87,90}; // 7 items
vector<int> vec3 = {0,0,0,0,0,0,0,0,0,0,0}; // 11 items
3 转换
transform(vec.begin(), vec.end(), // Source
vec3.begin(), // Destination
[](int x){ return x-1;}); // Operation
transform(vec.begin(), vec.end(), // Source #1
vec2.begin(), // Source #2
vec3.begin(), // Destination
[](int x, int y){ return x+y;}); // Operation
// 将vec和vec2的元素相加存到vec3中
// vec3[0] = vec[0] + vec2[0]
// vec3[1] = vec[1] + vec2[1]
// ...
4 交换--双向拷贝
swap_ranges(vec.begin(), vec.end(), vec2.begin());
5 填充
vector<int> vec = {0, 0, 0, 0, 0};
fill(vec.begin(), vec.end(), 9); // vec: {9, 9, 9, 9, 9}
fill_n(vec.begin(), 3, 9); // vec: {9, 9, 9, 0, 0}
generate(vec.begin(), vec.end(), rand); // 函数生成的值填充
generate_n(vec.begin(), 3, rand);
6 替换
replace(vec.begin(), vec.end(), // 替换的范围
6, // 替换的旧值
9); // 新值
replace_if(vec.begin(), vec.end(), // 替换的范围
[](int x){return x>80;}, // 旧值替换的条件
9); // 新值
replace_copy(vec.begin(), vec.end(), // 源
vec2.begin(), // 目的
6, // 旧值
9); // 新值
// 通用形式: replace_copy_if()
7 删除
remove(vec.begin(), vec.end(), 3); // 删除值
remove_if(vec.begin(), vec.end(), [](int x){return x>80;});
// 满足条件删除
remove_copy(vec.begin(), vec.end(), // Source
vec2.begin(), // Destination
6); // Condition
// 将剩余的元素拷贝到vec2
// 通用形式: remove_copy_if()
unique(vec.begin(), vec.end()); // 删除连续的相等的值
unique(vec.begin(), vec.end(), less<int>());
// 前一个元素与当前元素满足谓词条件的,删除当前元素
unique_copy(vec.begin(), vec.end(), vec2.begin());
// 删除连续重复的元素,剩余的拷贝
// 通用形式: unique_copy()
改变顺序的算法
- reverse, rotate, permute, shuffle
vector<int> vec = {9,60,70,8,45,87,90}; // 7 items
vector<int> vec2 = {0,0,0,0,0,0,0}; // 7 items
1 反转
reverse(vec.begin()+1, vec.end()-1);
// vec: {9,87,45,8,70,60,90}; // 7 items
reverse_copy(vec.begin()+1, vec.end()-1, vec2.begin());
// vec2: {87,45,8,70,60,0,0};
2 旋转
// 前面的元素依次移到最后,直到指定的元素成为第一个元素
rotate(vec.begin(), vec.begin()+3, vec.end());
// vec: {8,45,87,90,9,60,70}; // 7 items
rotate_copy(vec.begin(), vec.begin()+3, vec.end(), // Source
vec2.begin()); // Destination
// 旋转后的结果拷贝到vec2
// vec不变
3 置换
next_permutation(vec.begin(), vec.end());
//字典序下一个排列
prev_permutation(vec.begin(), vec.end());
//字典序上一个排列
// {1,2,3,5} < {1,2,4,4}
// {1,2} < {1,2,3}
//递增排序: {8, 9, 45, 60, 70, 87, 90}
// - 字典序最小
//
//递减排序: {90, 87, 70, 60, 45, 9, 8}
// - 字典序最大
// 通用的版本: next_permutation(), prev_permutation()
4 打乱
//每个元素随机选择一个元素交换
random_shuffle(vec.begin(), vec.end());
random_shuffle(vec.begin(), vec.end(), rand);
// C++ 11
shuffle(vec.begin(), vec.end(), default_random_engine());
// 更好的随机数发生器
STL基础--算法(修改数据的算法)的更多相关文章
- STL基础--算法(不修改数据的算法)
不修改数据的算法 count, min and max, compare, linear search, attribute // 算法中Lambda函数很常用: num = count_if(vec ...
- Project2--Lucene的Ranking算法修改:BM25算法
原文出自:http://blog.csdn.net/wbia2010lkl/article/details/6046661 1. BM25算法 BM25是二元独立模型的扩展,其得分函数有很 ...
- STL基础--算法(已排序数据的算法,数值算法)
已排序数据的算法 Binary search, merge, set operations 每个已排序数据算法都有一个同名的更一般的形式 vector vec = {8,9,9,9,45,87,90} ...
- STL区间成员函数及区间算法总结
STL区间成员函数及区间算法总结 在这里总结下可替代循环的区间成员函数和区间算法: 相比单元素遍历操作,使用区间成员函数的优势在于: 1)更少的函数调用 2)更少的元素移动 3)更少的内存分配 在区间 ...
- STL——配接器、常用算法使用
学习STL,必然会用到它里面的适配器和一些常用的算法.它们都是STL中的重要组成部分. 适配器 在STL里可以用一些容器适配得到适配器.例如其中的stack和queue就是由双端队列deque容器适配 ...
- stl之容器、迭代器、算法几者之间的关系
转自:https://blog.csdn.net/bobodem/article/details/49386131 stl包括容器.迭代器和算法: 容器 用于管理一些相关的数据类型.每种容器都有它的优 ...
- Java基础复习笔记基本排序算法
Java基础复习笔记基本排序算法 1. 排序 排序是一个历来都是很多算法家热衷的领域,到现在还有很多数学家兼计算机专家还在研究.而排序是计算机程序开发中常用的一种操作.为何需要排序呢.我们在所有的系统 ...
- 【BZOJ】3052: [wc2013]糖果公园 树分块+带修改莫队算法
[题目]#58. [WC2013]糖果公园 [题意]给定n个点的树,m种糖果,每个点有糖果ci.给定n个数wi和m个数vi,第i颗糖果第j次品尝的价值是v(i)*w(j).q次询问一条链上每个点价值的 ...
- 【C/C++学院】0723-32位与64位/调戏窗体程序/数据分离算法/内存检索/二分查找法/myVC
[送给在路上的程序猿] 对于一个开发人员而言,能够胜任系统中随意一个模块的开发是其核心价值的体现. 对于一个架构师而言,掌握各种语言的优势并能够运用到系统中,由此简化系统的开发,是其架构生涯的第一步. ...
随机推荐
- Gym - 101002D:Programming Team (01分数规划+树上依赖背包)
题意:给定一棵大小为N的点权树(si,pi),现在让你选敲好K个点,需要满足如果如果u被选了,那么fa[u]一定被选,现在要求他们的平均值(pi之和/si之和)最大. 思路:均值最大,显然需要01分数 ...
- POJ 2751:Seek the Name, Seek the Fame(Hash)
Seek the Name, Seek the Fame Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 24077 Ac ...
- win10 ubuntu 同一硬盘双系统安装和启动设置
1.了解启动的顺序 电脑开机---> BIOS 设置 ----> 硬盘(MBR)/ GPT格式里的ESP分区 ---> (UEFI/GRUB)目录里的 *****.efi -- ...
- HDU 2036 叉乘求三角形面积
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s) ...
- 读书笔记--More Effective C++--效率(总结)
PS: 本文只是总结,具体内容需要去查看More Effective C++--效率部分. 1. 80—20准则 大约 20%的代码使用了 80%的程序资源:大约 20%的代码耗用了大约 80%的运行 ...
- 【带权并查集】【HDOJ】
http://acm.hdu.edu.cn/showproblem.php?pid=3047 Zjnu Stadium Time Limit: 2000/1000 MS (Java/Others) ...
- 【mybatis源码学习】mybtias基础组件-反射工具
一.JavaBean的规范 类中定义的成员变量也称为字段,属性则是通过getter/setter方法得到的,属性只与类中的方法有关,与是否存在对应成员变量没有关系. 属性的getter/setter方 ...
- 【spring源码分析】BeanDefinitionRegistryPostProcessor解析
一.自定义BeanDefinitionRegistryPostProcessor BeanDefinitionRegistryPostProcessor继承自BeanFactoryPostProces ...
- day4python学习
2.3.1.字符串的索引与切片. 字符串是不可变类型,所有对他的操作(如切片split)都是生成的新的字符串, 索引即下标,就是字符串组成的元素从第一个开始,初始索引为0以此类推,从右往左数的话是从- ...
- 数学 它的内容,方法和意义 第二卷 (A. D. 亚历山大洛夫 著)
第五章 常微分方程 1. 绪论 2. 常系数线性微分方程 3. 微分方程的解及应注意的几个方面 4. 微分方程积分问题的几何解释.问题的推广 5. 微分方程解的存在性与唯一性方程的近似解 6. 奇点 ...