STL学习笔记(变序性算法)
变序性算法改变元素的次序,但不改变元素值。
这些算法不能用于关联式容器,因为在关联式容器中,元素有一定的次序,不能随意变动。
逆转元素次序
void
reverse(BidirectionalIterator beg,BidirectionalIterator end)
OutputIterator
reverse_copy(BidirectionalIterator sourceBeg,BidirectionalIterator sourceEnd,
OutputIterator destBeg)
1.reverce()会将区间[beg,end)内的元素全部逆序
2.reverse_copy()是reverse()跟copy()的组合
下面这个程序展示reverse()和reverse_copy()的用法
#include <iterator>
#include "algostuff.hpp"
using namespace std; int main()
{
vector<int> coll;
INSERT_ELEMENTS(coll,,);
PRINT_ELEMENTS(coll,"coll: ");
reverse(coll.begin(),coll.end());
PRINT_ELEMENTS(coll,"coll: ");
reverse(coll.begin()+,coll.end()-);
PRINT_ELEMENTS(coll,"coll: ");
reverse_copy(coll.begin(),coll.end(),ostream_iterator<int>(cout," "));
cout<<endl;
}
旋转(Rotating)元素次序
1.旋转序列内的元素
void
rotate(ForwardIterator beg,ForwardIterator newBeg,
ForwardIterator end)
1.将区间[beg,end)内的元素进行旋转,执行后*newBeg成为新的第一元素
2.调用者必须确保newBeg是[beg,end)内的一个有效位置,否则会引发未定义的行为
以下程序示范如何使用rotate()
#include "algostuff.hpp"
using namespace std; int main()
{
vector<int> coll;
INSERT_ELEMENTS(coll,,);
PRINT_ELEMENTS(coll,"coll: ");
rotate(coll.begin(),coll.begin()+,coll.end());
PRINT_ELEMENTS(coll,"one left: ");
rotate(coll.begin(),coll.end()-,coll.end());
PRINT_ELEMENTS(coll,"two right: ");
rotate(coll.begin(),find(coll.begin(),coll.end(),),coll.end());
PRINT_ELEMENTS(coll,"4 first: ");
}
2.复制并同时旋转元素
OutputIterator
rotate_copy(ForwardIterator sourceBeg,ForwardIterator newBeg,
ForwardIterator sourceEnd,
OutputIterator destBeg)
这是copy()和rotate()的组合
以下程序示范rotate_copy()的用法
#include <iterator>
#include "algostuff.hpp"
using namespace std; int main()
{
set<int> coll;
INSERT_ELEMENTS(coll,,);
PRINT_ELEMENTS(coll);
set<int>::iterator pos=coll.begin();
advance(pos,);
rotate_copy(coll.begin(),pos,coll.end(),ostream_iterator<int>(cout," "));
cout<<endl;
pos=coll.end();
advance(pos,-);
rotate_copy(coll.begin(),pos,coll.end(),ostream_iterator<int>(cout," "));
cout<<endl;
rotate_copy(coll.begin(),coll.find(),coll.end(),ostream_iterator<int>(cout," "));
cout<<endl;
}
排列元素(Permuting)元素
bool
next_permutation(BidirectionalIterator beg,
BidirectionalIterator end)
bool
prev_permutation(BidirectionalIterator beg,
BidirectionalIterator end)
1.next_permutation()会改变区间[beg,end)内的元素次序,使他们符合“下一个排列次序”
2.prev_permutation()会改变区间[beg,end)内的元素次序,是他们符合“上一个排列次序”
下面这个例子展示利用next_permutation()和prev_permutation()将所有元素的所有可能排列的过程
#include "algostuff.hpp"
using namespace std; int main()
{
vector<int> coll;
INSERT_ELEMENTS(coll,,);
PRINT_ELEMENTS(coll,"on entry: ");
while(next_permutation(coll.begin(),coll.end()))
PRINT_ELEMENTS(coll," ");
PRINT_ELEMENTS(coll,"afterward: ");
while(prev_permutation(coll.begin(),coll.end()))
PRINT_ELEMENTS(coll," ");
PRINT_ELEMENTS(coll,"now: ");
while(prev_permutation(coll.begin(),coll.end()))
PRINT_ELEMENTS(coll," ");
PRINT_ELEMENTS(coll,"afterward: ");
}
重排元素(Shuffling,搅乱次序)
void
random_shuffle(RandomAccessIterator beg,RandomAccessIterator end)
void
random_shuffle(RandomAccessIterator beg,RandomAccessIterator end,
RandomFunc& op)
1.第一形式使用一个均匀分布随机数产生器来打乱区间[beg,end)内的元素次序
2.第二形式使用op打乱区间[beg,end)内的元素次序。
以下程序示范如何调用random_shuffle()来打乱元素次序
#include <cstdlib>
#include "algostuff.hpp"
using namespace std; class MyRandom
{
public:
ptrdiff_t operator()(ptrdiff_t max)
{
double tmp;
tmp=static_cast<double>(rand())/static_cast<double>(RAND_MAX);
return static_cast<ptrdiff_t>(tmp * max);
}
}; int main()
{
vector<int> coll;
INSERT_ELEMENTS(coll,,);
PRINT_ELEMENTS(coll,"coll: ");
random_shuffle(coll.begin(),coll.end());
PRINT_ELEMENTS(coll,"shuffled: ");
sort(coll.begin(),coll.end());
PRINT_ELEMENTS(coll,"sorted: ");
MyRandom rd;
random_shuffle(coll.begin(),coll.end(),rd);
PRINT_ELEMENTS(coll,"shuffled: ");
}
将元素向前搬移
BidirectionalIterator
partition(BidirectionalIterator beg,
BidirectionalIterator end,
UnaryPredicate op)
BidirectionalIterator
stable_partition(BidirectionalIterator beg,
BidirectionalIterator end,
UnaryPredicate op)
1.这两种算法将区间[beg,end)中造成以下一元判断式:op(elem)结果为true的元素向前端移动
2.stable_partition()会保持元素之间的相对次序。
以下程序示范partition()和stable_partition()的用法以及两者的区别
#include "algostuff.hpp"
using namespace std; int main()
{
vector<int> coll1;
vector<int> coll2;
INSERT_ELEMENTS(coll1,,);
INSERT_ELEMENTS(coll2,,);
PRINT_ELEMENTS(coll1,"coll1: ");
PRINT_ELEMENTS(coll2,"coll2: ");
cout<<endl;
vector<int>::iterator pos1,pos2;
pos1=partition(coll1.begin(),coll1.end(),not1(bind2nd(modulus<int>(),)));
pos2=stable_partition(coll2.begin(),coll2.end(),not1(bind2nd(modulus<int>(),)));
PRINT_ELEMENTS(coll1,"coll1: ");
cout<<"first odd element: "<<*pos1<<endl;
PRINT_ELEMENTS(coll2,"coll1: ");
cout<<"first odd elements: "<<*pos2<<endl;
PRINT_ELEMENTS(coll2,"coll2: ");
}
STL学习笔记(变序性算法)的更多相关文章
- Effective STL 学习笔记 31:排序算法
Effective STL 学习笔记 31:排序算法 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
- STL学习笔记7 ---- algorithm(算法)
STL中算可以分为三种, 1.变序型队列算法,可以改变容器内的数据: 2.非变序型队列算法,处理容器内的数据而不改变他们 : 3.通用数值算法,这涉及到很多专业领域的算术操作,这里不做介绍. 第一是变 ...
- STL学习笔记(非变动性算法)
辅助函数 本节跟以后几节将对所有STL算法逐一详细讨论.为了简化这些例子,我们使用了一些辅助函数,分别用于对容器进行输出跟插入操作. #ifndef ALGOSTUFF_HPP #define ALG ...
- STL学习笔记(算法概述)
算法头文件 要运用C++标准程序库的算法,首先必须包含头文件<algorithm> 使用STL算法时,经常需要用到仿函数以及函数配接器.它们定义域<functional>头文件 ...
- Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据
Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据 */--> div.org-src-container { font-size: 85%; font-fam ...
- Effective STL 学习笔记 Item 38 : Design functor classes for pass-by-value
Effective STL 学习笔记 Item 38 : Design functor classes for pass-by-value */--> div.org-src-container ...
- 机器学习实战(Machine Learning in Action)学习笔记————07.使用Apriori算法进行关联分析
机器学习实战(Machine Learning in Action)学习笔记————07.使用Apriori算法进行关联分析 关键字:Apriori.关联规则挖掘.频繁项集作者:米仓山下时间:2018 ...
- Effective STL 学习笔记 39 ~ 41
Effective STL 学习笔记 39 ~ 41 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
- Effective STL 学习笔记 Item 30: 保证目标区间足够大
Effective STL 学习笔记 Item 30: 保证目标区间足够大 */--> div.org-src-container { font-size: 85%; font-family: ...
随机推荐
- panel(NOIP模拟赛Round 4)
好吧,,这道题..本来以为挺难的.打了个暴力bfs+hash(期望得分30,实际得分30) 奇特的是,这道题如果不用hash(期望得分20,实际得分100),好吧数据实在是太水了(不会T吗?) 然后我 ...
- JMM内存模型+volatile+synchronized+lock
硬件内存模型: Java内存模型: 每个线程都有一个工作内存,线程只可以修改自己工作内存中的数据,然后再同步回主内存,主内存由多个内存共享. 下面 8 个操作都是原子的,不可再分的: 1) lock ...
- linux题目整理(二)
1.如何过滤出已知当前目录下oldboy中的所有一级目录(不包含子目录,即只能是一级目录) 方法1:find ./ -type d -maxdepth 1方法2:ls -F方法3:ls -l | g ...
- 在OpenResty中使用淘宝的concat进行css和js合并,同时支持GZIP静态压缩
=======================================================================================cd /usr/local ...
- 你不知道的 JavaScript 基础细节
语法部分 type 属性: 默认的 type 就是 javascript, 所以不必显式指定 type 为 javascript javascript 不强制在每个语句结尾加 “:” , javasc ...
- 51nod 1091 线段的重叠【贪心/区间覆盖类】
1091 线段的重叠 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注 X轴上有N条线段,每条线段包括1个起点和终点.线段的重叠是这样来算的,[10 2 ...
- POJ 3977:Subset(折半枚举+二分)
[题目链接] http://poj.org/problem?id=3977 [题目大意] 在n个数(n<36)中选取一些数,使得其和的绝对值最小. [题解] 因为枚举所有数选或者不选,复杂度太高 ...
- [51Nod1487]占领资源
题目大意: 有一个$n\times m(x,m\leq 100)$的网格图,每个格子有一个权值$w_{i,j}(1\leq w_{i,j}\leq 9)$.你可以在图中选两个格子,每个格子$(x,y ...
- 图论常用算法之一 POJ图论题集【转载】
POJ图论分类[转] 一个很不错的图论分类,非常感谢原版的作者!!!在这里分享给大家,爱好图论的ACMer不寂寞了... (很抱歉没有找到此题集整理的原创作者,感谢知情的朋友给个原创链接) POJ:h ...
- UIActivityIndicatorView活动指示器
活动指示器(UIActivityIndicatorView)可以告知用户有一个操作正在进行中.派生自UIView,所以他是视图,也可以附着在视图上. 一.创建 UIActivityIndicatorV ...