stl变易算法(一)
C++ STL的变易算法是一组可以改动容器元素数据的模板函数,可进行序列容器的复制、交换、替换、填充、移除、旋转等。这些算法对迭代器有较高的要求。详细的迭代器类型随各个算法而定,或向前迭代器、或双向迭代器、又或者是随机迭代器,以提供算法所须要的迭代器操作。
应用变易算法时,先要检查容器的迭代器是否符合要求,防止产生编译错误。
元素复制copy
C++STL提供一个用于容器间元素拷贝的copy算法。将迭代区间[first,last)的元素拷贝到由复制目标迭代器result给定的区间[result,result+(last-first))中,原型例如以下:
template <class InputIterator, class OutputIterator>
OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result);
详细代码例如以下:
template<class InputIterator, class OutputIterator>
OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result)
{
while (first!=last) {
*result = *first;
++result;
++first;
}
return result;
}
//实例
#include <algorithm>
#include <vector>
#include <list>
#include <iostream>
using namespace std;
void print(int x){
cout << x << " ";
}
int main(void){
//初始化向量v
vector<int> v;
v.push_back(1);
v.push_back(3);
v.push_back(5);
//初始化双向链表l
list<int> l;
l.push_back(2);
l.push_back(4);
l.push_back(6);
l.push_back(8);
l.push_back(10);
//复制v到l
copy(v.begin(), v.end(), l.begin());
//链表l打印l 3 5 8 10
for_each(l.begin(), l.end(), print);
cout <<endl;
return 0;
}
反向复制copy_backward
与copy算法类似,copy_backward算法也是将一个迭代器区间元素拷贝到还有一迭代器区间上,仅仅是复制的过程是从最后的元素開始复制,直到首元素复制出来。
它使用的原型例如以下,将迭代器区间[first,last)的元素。拷贝到以result为结束位置的区间[result-(last-first))中。顺序为*(last-1)拷贝到*(result-1)、*(last-2)拷贝到*(result-2)、*(last-3)拷贝到*(result-3)、……
//copy_backward算法函数的代码
template<class BidirectionalIterator1, class BidirectionalIterator2>
BidirectionalIterator2 copy_backward ( BidirectionalIterator1 first,
BidirectionalIterator1 last,
BidirectionalIterator2 result )
{
while (last!=first) *(--result) = *(--last);
return result;
}
//測试用例
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
void print(int x){
cout << x << ' ';
}
int main(void){
vector<int> v(10);
for(unsigned int i=0; i<v.size(); i++)
v[i]=i+1;
copy_backward(v.begin(), v.begin() + 3, v.end());
for_each(v.begin(), v.end(), print);
cout << endl;
system("pause");
return 0;
}
元素交换swap
尽管大多数容器的内部提供了swap函数,但c++STL还是以更一般的迭代器形式。提供更一般的swap算法来实现两个元素的交换。
//swap算法函数的代码
template <class T> void swap ( T& a, T& b )
{
T c(a); a=b; b=c;
}
//实例
#include <algorithm>
#include <iostream>
using namespace std;
int main(void)
{
int a = 5;
int b = 26;
cout << "交换前 " << "a = " << a << " b = " << b << endl;
swap(a, b);
cout << "交换后 " << "a = " << a << " b = " << b << endl;
return 0;
}
迭代器交换iter_swap
iter_swap算法是swap算法的迭代器形式,使交换算法更易用于一般的容器。
template <class ForwardIterator1, class ForwardIterator2>
void iter_swap (ForwardIterator1 a, ForwardIterator2 b)
{
swap (*a, *b);
}
//样例
#include <algorithm>
#include <iostream>
using namespace std;
int main(void)
{
int a = 5;
int b = 26;
cout << "交换前 " << "a = " << a << " b = " << b << endl;
iter_swap(&a, &b);
cout << "交换后 " << "a = " << a << " b = " << b << endl;
system("pause");
return 0;
}
区间元素交换swap_ranges
直观来说。swap_ranges算法用于进行两个迭代器区间元素的交换。
它的使用原型例如以下,将[first1,last1)迭代器区间的元素,与[first2,first2+(last1-first1))迭代器区间元素交换。当中*first1和*first2交换,*(first1+1)和*(first2+1)交换、……、*(last1-1)和*(first2+(last1-first1)-1)交换。
template<class ForwardIterator1, class ForwardIterator2>
ForwardIterator2 swap_ranges (ForwardIterator1 first1, ForwardIterator1 last1,
ForwardIterator2 first2)
{
while (first1!=last1) {
swap (*first1, *first2);
++first1; ++first2;
}
return first2;
}
//实例
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
void print(int x)
{
cout << x << " ";
}
int main(void)
{
vector<int> v1, v2;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
v2.push_back(2);
v2.push_back(4);
v2.push_back(6);
//打印v1、v2
cout << "交换前, v1=";
for_each(v1.begin(), v1.end(), print);
cout << "v2=";
for_each(v2.begin(), v2.end(), print);
cout << endl;
//交换v1、v2
swap_ranges(v1.begin(), v1.end(), v2.begin());
//打印v1、v2
cout << "交换后, v1=";
for_each(v1.begin(), v1.end(), print);
cout << "v2=";
for_each(v2.begin(), v2.end(), print);
cout << endl;
return 0;
}
未完待续……
转载请注明出处:http://blog.csdn.net/lsh_2013/article/details/46854397
stl变易算法(一)的更多相关文章
- stl变易算法(三)
本篇接着前面stl变易算法(一)和stl变易算法(二)继续讲述变易算法. 这里将介绍完余下的变易算法,主要有:填充fill.n次填充fill_n.随机生成元素generate.随机生成n个元素gene ...
- stl非变易算法(二)
这里接着上篇stl非变易算法(一)进行总结.主要解析算法函数count.count_if.mismatch.equal.search.search_n以及find_end.给出算法函数的实现及測试用例 ...
- 变易算法 - STL算法
欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/mutating-algorithms.h ...
- STL非变易算法 - STL算法
欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/1394600460.html 原创:ST ...
- STL非变易算法
非变易算法:原则上不会变更操作数据的算法. [1] for_each:逐个容器元素,原型for_each(InputIter first, InputIter last, Function f) ...
- 常用的STL查找算法
常用的STL查找算法 <effective STL>中有句忠告,尽量用算法替代手写循环:查找少不了循环遍历,在这里总结下常用的STL查找算法: 查找有三种,即点线面: 点就是查找目标为单个 ...
- 【STL】帮你复习STL泛型算法 一
STL泛型算法 #include <iostream> #include <vector> #include <algorithm> #include <it ...
- STL基础--算法(排序)
STL排序算法 排序算法要求随机访问迭代器 vector, deque, container array, native array 例子 vector<int> vec = {9,1,1 ...
- C++复习:STL之算法
算法 1算法基础 1.1算法概述 算法部分主要由头文件<algorithm>,<numeric>和<functional>组成. <algorithm> ...
随机推荐
- HDU——T 2594 Simpsons’ Hidden Talents
http://acm.hdu.edu.cn/showproblem.php?pid=2594 Time Limit: 2000/1000 MS (Java/Others) Memory Limi ...
- Tomcat之虚拟主机配置以及web应用配置
Tomcat之虚拟主机配置以及web应用配置 Tomcat文件夹结构例如以下: bin ---- 启动和关闭须要的bat文件所在的文件夹 conf --- 配置文件夹 lib --- tomcat执 ...
- Highcharts图表的注解功能
Highcharts图表的注解功能 在图表中,往往须要对图表总体或者部分元素进行对应注解.帮助浏览者阅读图表.尽管标签组labels能够实现类似的功能.可是其功能相对简单.要实现复杂的注解功能,用户能 ...
- Android Studio 函数使用方法提示 快捷键
看到好多说用F2的,转来转去,中国社区的氛围大概如此,你抄我的,我超你的. 下面的千篇一律: "悬浮窗不出来了,各种不习惯啊.那在Android Studio究竟怎样查看函数的说明呢.选中你 ...
- [TypeScript] Make Properties and Index Signatures Readonly in TypeScript
TypeScript 2.0 introduced the readonly modifier which can be added to a property or index signature ...
- eclipse- 智能提示设置
最近自己ubuntu 下的eclipse没办法只能提示了.后来在网上查了方法,完美解决了问题 1.java代码编辑的时候不提示 具体如下 Windows→Preferences→Java→Editor ...
- golang panic and recover
panic 是一个内置函数,当一个函数 F 调用 panic,F 的执行就会停止,F 中 deferred 函数调用会被执行,然后 F 返回控制到它的调用者.这个过程会沿着调用栈执行下去,直到当前 g ...
- 洛谷 P2616 [USACO10JAN]购买饲料II Buying Feed, II
洛谷 P2616 [USACO10JAN]购买饲料II Buying Feed, II https://www.luogu.org/problemnew/show/P2616 题目描述 Farmer ...
- C# Bartender模板打印 条码,二维码, 文字, 及操作RFID标签等。
1.在之前写的一篇文章中, 有讲到如何利用ZPL命令去操作打印里, 后面发现通过模板的方式会更加方便快捷, 既不用去掌握ZPL的实现细节, 就可以轻松的调用实现打印的功能. 解决方案: 1.网络下载 ...
- Android怎样实现毛玻璃效果之Android高级模糊技术
自从iOS系统引入了Blur效果,也就是所谓的毛玻璃.模糊化效果.磨砂效果.各大系统就開始竞相模仿,这是如何的一个效果呢,我们先来看一下,如以下的图片: 效果我们知道了,怎样在Android中实现呢. ...