STL学习笔记(变动性算法)
本节描述的算法会变动区间内的元素内容。有两种方法可以变动元素内容:
1.运用迭代器遍历序列的过程中,直接加以变动
2.将元素从源区间赋值到目标区间的过程中加以变动
复制(copy)元素
OutputIterator
copy(InputIterator sourceBeg,
InputIterator sourceEnd,
OutputIterator destBeg)
BiderectionalIterator
copy_backward(BidirectionalIterator sourceBeg,
BidirectionalIterator sourceEnd,
BidirectionalIterator destEnd)
1.这两个算法都将源区间[sourceBeg,sourceEnd)中的所有元素赋值到以destBeg为起点或以destEnd为终点的目标区间去
2.返回目标区间内最后一个被赋值元素的下一位置,也就是第一个违背覆盖的元素的位置
3.destBeg或destEnd不可处于[sourceBeg,sourceEnd)区间内
下面的例子展示copy()的一些简单用法
#include <iterator>
#include "algostuff.hpp"
using namespace std; int main()
{
vector<int> coll1;
list<int> coll2;
INSERT_ELEMENTS(coll1,,);
copy(coll1.begin(),coll1.end(),back_inserter(coll2));
copy(coll2.begin(),coll2.end(),ostream_iterator<int>(cout," "));
cout<<endl;
copy(coll1.rbegin(),coll1.rend(),coll2.begin());
copy(coll2.begin(),coll2.end(),ostream_iterator<int>(cout," "));
cout<<endl;
}
转换(Transforming)和结合(Combining)元素
算法transform()提供一下两种能力:
1.转换元素
OutputIterator
transform(InputIterator sourceBeg,InputIterator sourceEnd,
OutputIterator destBeg,UnaryFunc op)
针对源区间[sourceBeg,sourceEnd)中的每一个元素调用 op(elem),并将结果写到以destBeg起始的目标区间内。
下面这个例子展示了transform()的转换元素功能
#include <iterator>
#include "algostuff.hpp"
using namespace std; int main()
{
vector<int> coll1;
list<int> coll2;
INSERT_ELEMENTS(coll1,,);
PRINT_ELEMENTS(coll1,"coll1: ");
transform(coll1.begin(),coll1.end(),coll1.begin(),negate<int>());
PRINT_ELEMENTS(coll1,"negated: ");
transform(coll1.begin(),coll1.end(),back_inserter(coll2),bind2nd(multiplies<int>(),));
PRINT_ELEMENTS(coll2,"coll2: ");
transform(coll2.rbegin(),coll2.rend(),ostream_iterator<int>(cout," "),negate<int>());
cout<<endl;
}
2.将两序列的元素加以结合
OutputIterator
transform(InputIterator source1Beg,InputIterator source1End,
InputIterator source2Beg,
OutputIterator destBeg,
BinaryFunc op)
针对第一源区间[source1Beg,source1End)以及“从source2Beg开始的第二个源区间“对应的元素,调用:
op(source1Elem,source2Elem) 并将结果以destBeg起始的目标区间内。
下面这个例子展示以上所说的transform()用法:
#include <iterator>
#include "algostuff.hpp"
using namespace std; int main()
{
vector<int> coll1;
list<int> coll2;
INSERT_ELEMENTS(coll1,,);
PRINT_ELEMENTS(coll1,"coll1: ");
transform(coll1.begin(),coll1.end(),coll1.begin(),coll1.begin(),multiplies<int>());
PRINT_ELEMENTS(coll1,"squared: ");
transform(coll1.begin(),coll1.end(),coll1.rbegin(),back_inserter(coll2),plus<int>());
PRINT_ELEMENTS(coll2,"coll2: ");
cout<<"diff: ";
transform(coll1.begin(),coll1.end(),coll2.begin(),ostream_iterator<int>(cout," "),minus<int>());
cout<<endl;
}
互换(Swapping)元素内容
ForwardIterator
swap_ranges(ForwardIterator beg1,ForwardIterator end1,
ForwardIterator beg2)
1.强区间[beg1,end1)内的元素和”从beg2开始的区间“内的对应元素互换
2.返回第二区间中”最后一个被交换元素“的下一位置
下面这个例子展示swap_ranges()的用法
#include "algostuff.hpp"
using namespace std; int main()
{
vector<int> coll1;
deque<int> coll2;
INSERT_ELEMENTS(coll1,,);
INSERT_ELEMENTS(coll2,,);
PRINT_ELEMENTS(coll1,"coll1: ");
PRINT_ELEMENTS(coll2,"coll2: ");
deque<int>::iterator pos;
pos=swap_ranges(coll1.begin(),coll1.end(),coll2.begin());
PRINT_ELEMENTS(coll1,"\ncoll1: ");
PRINT_ELEMENTS(coll2,"coll2: ");
if(pos!=coll2.end())
cout<<"first element not modified: "<<*pos<<endl;
swap_ranges(coll2.begin(),coll2.begin()+,coll2.rbegin());
PRINT_ELEMENTS(coll2,"\ncoll2:");
}
赋予(Assigning)新值
1.赋予完全相同的数值
void
fill(ForwardIterator beg,ForwardIterator end,
const T& newValue)
void
fill(ForwardIterator beg,Size num,
const T& newValue)
1.fill()将区间[beg,end)内的每一个元素都赋予新值newValue
2.fill_n()将”从beg开始的前num个元素“赋予新值newValue
3.调用者必须确保目标区间有足够空间,要不就得用插入行迭代器
以下程序展示fill()和fill_n()的用法
#include <iterator>
#include "algostuff.hpp"
using namespace std; int main()
{
fill_n(ostream_iterator<float>(cout," "),,7.7);
cout<<endl;
list<string> coll;
fill_n(back_inserter(coll),,"hello");
PRINT_ELEMENTS(coll,"coll: ");
fill(coll.begin(),coll.end(),"again");
PRINT_ELEMENTS(coll,"coll: ");
fill_n(coll.begin(),coll.size()-,"hi");
PRINT_ELEMENTS(coll,"coll: ");
list<string>::iterator pos1,pos2;
pos1=coll.begin();
pos2=coll.end();
fill(++pos1,--pos2,"hmmm");
PRINT_ELEMENTS(coll,"coll: ");
}
2.赋予新产生的数值
void
generate(ForwardIterator beg,ForwardIterator end,
Func op)
void
generate_n(OutputIterator beg,Size num,
Func op)
1.generate()会调用以下动作:op() ,并赋值给区间[beg,end)内的每个元素
2.generate_n()会调用以下动作: op(),并赋值给”以beg起始的区间“内的前num个元素
以下程序展示如何利用generate()和generatr_n()安插和赋值一些随机数
#include <cstdlib>
#include "algostuff.hpp"
using namespace std; int main()
{
list<int> coll;
generate_n(back_inserter(coll),,rand);
PRINT_ELEMENTS(coll);
generate(coll.begin(),coll.end(),rand);
PRINT_ELEMENTS(coll);
}
替换(Replacing)元素
1.替换序列内的元素
void
replace(ForwardIterator beg,ForwardIterator end,
const T& oldValue,const T& newValue)
void
replace_if(ForwardIterator beg,ForwardIterator end,
UnaryPredicate op,const T& newValue)
1.replace()将区间[beg,end)之内每一个”与oldValue相等“的元素替换成newValue
2.replace_if()将区间[beg,end)之内每一个以下一元判断式:op(elem)返回true的元素替换成newValue
以下程序示范replace()和replace_if()的用法
#include "algostuff.hpp"
using namespace std; int main()
{
list<int> coll;
INSERT_ELEMENTS(coll,,);
INSERT_ELEMENTS(coll,,);
PRINT_ELEMENTS(coll,"coll: ");
replace(coll.begin(),coll.end(),,);
PRINT_ELEMENTS(coll,"coll: ");
replace_if(coll.begin(),coll.end(),bind2nd(less<int>(),),);
PRINT_ELEMENTS(coll,"coll: ");
}
2.复制并替换元素
OutputIterator
replace_copy(InputIterator sourceBeg,InputIterator sourceEnd,
OutputIterator destBeg,
const T& oldValud,const T& newValue)
OutputIterator
replace_copy_if(InputIterator sourceBeg,InputIterator sourceEnd,
OutputIterator destBeg,
UnaryPredicate op,const T& newValue)
1.replace_copy()是copy()和replace()的组合。他将源区间[beg,end)中的元素赋值到”以destBeg为起点“的目标区间
同时将其中”与oldValue相等“的所有元素替换为newValue
2.replace_copy()是copy()和replace_if()的组合。
以下程序示范如何使用replace_copy()和replace_copy_if()
#include <iterator>
#include "algostuff.hpp"
using namespace std; int main()
{
list<int> coll;
INSERT_ELEMENTS(coll,,);
INSERT_ELEMENTS(coll,,);
PRINT_ELEMENTS(coll);
replace_copy(coll.begin(),coll.end(),ostream_iterator<int>(cout," "),,);
cout<<endl;
replace_copy_if(coll.begin(),coll.end(),ostream_iterator<int>(cout," "),bind2nd(less<int>(),),);
cout<<endl;
}
STL学习笔记(变动性算法)的更多相关文章
- STL学习笔记(算法概述)
算法头文件 要运用C++标准程序库的算法,首先必须包含头文件<algorithm> 使用STL算法时,经常需要用到仿函数以及函数配接器.它们定义域<functional>头文件 ...
- STL学习笔记--排序算法
排序算法 C++ STL 的排序算法(Sorting algorithms)是一组将无序序列排列成有序序列的模板函数或与排序相关的模板函数,提供了排序.折半搜索.归并.集合操作.堆操作.最值求解.字典 ...
- STL学习笔记(五) 算法
条款30:确保目标区间足够大 条款31:了解各种与排序有关的选择 //使用unaryPred划分输入序列,使得unaryPred为真的元素放在序列开头 partition(beg, end, unar ...
- Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据
Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据 */--> div.org-src-container { font-size: 85%; font-fam ...
- Effective STL 学习笔记 31:排序算法
Effective STL 学习笔记 31:排序算法 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
- Effective STL 学习笔记 39 ~ 41
Effective STL 学习笔记 39 ~ 41 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
- 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 ...
- Effective STL 学习笔记 Item 30: 保证目标区间足够大
Effective STL 学习笔记 Item 30: 保证目标区间足够大 */--> div.org-src-container { font-size: 85%; font-family: ...
- Effective STL 学习笔记: Item 22 ~ 24
Effective STL 学习笔记: Item 22 ~ 24 */--> div.org-src-container { font-size: 85%; font-family: monos ...
- Effective STL 学习笔记 Item 21:Comparison Function 相关
Effective STL 学习笔记 Item 21:Comparison Function 相关 */--> div.org-src-container { font-size: 85%; f ...
随机推荐
- [LeetCode] Evaluate Reverse Polish Notation stack 栈
Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...
- centos 安装使用smb
http://blog.csdn.net/edu_enth/article/details/52964295
- [译] 如何像 Python 高手一样编程?
转自:http://www.liuhaihua.cn/archives/23475.html Harries 发布于 7天前 分类:编程技术 阅读(15) 评论(0) 最近在网上看到一篇介绍Pytho ...
- linux0.11内核源码剖析:第一篇 内存管理、memory.c【转】
转自:http://www.cnblogs.com/v-July-v/archive/2011/01/06/1983695.html linux0.11内核源码剖析第一篇:memory.c July ...
- IFC and BFC
BFC and IFC 1,IFC -- 针对行内元素 -- 行内格式上下文 BFC --针对块级元素 -- 块级格式上下文 2,IFC特点: 行框的高度由包含元素的高度和有没有float元素决定. ...
- android的百度地图开发(一)
1,注册百度开发者账号 2,申请key ,注意开发版SH和发布版的SH 获取开发版SHA1: 输入命令:keytool -list -v -keystore debug.keystore,回车输入 ...
- 负载均衡技术之-lvs
LVS简介 Internet的快速增长使多媒体网络服务器面对的访问数量快速增加,服务器需要具备提供大量并发访问服务的能力,因此对于大负载的服务器来讲, CPU.I/O处理能力很快会成为瓶颈.由于单台服 ...
- hdu 1856(hash+启发式并查集)
More is better Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 327680/102400 K (Java/Others) ...
- HDU 1394.Minimum Inversion Number-最小逆序数-完全版线段树(单点增减、区间求和)
HDU1394.Minimum Inversion Number 这个题求最小逆序数,先建一个空的树,然后每输入一个值,就先查询一下,查询之后,更新线段树,然后遍历一遍,每次将第一个数放到最后之后,减 ...
- 51nod 1433 0和5【数论/九余定理】
1433 0和5 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 小K手中有n张牌,每张牌上有一个一位数的数,这个 ...