STL中copy算法
STL中通过使用copy函数以提供一种方便的方式来输出容器中的元素。函数copy作为泛型算法的一部分,任何容器类型都可以使用。由于我们需要频繁的初始容器的元素,因此在继续讨论容器之前,先学习一下copy函数的用法。
copy函数不只是输出容器的元素。通常,它允许我们复制元素从一个地方到另一个地方。例如输出vector的元素或复制vector的元素到另一个vector,我们可以使用copy函数。该函数模版copy的原型为:
template <class inputIterator, class outputIterator>
outputIterator copy(inputIterator first1, inputIterator last, outputIterator first2);
参数first1指定了开始拷贝元素的位置;参数last指定了结束位置。参数first2指定了拷贝元素到哪里。因此,参数first1和last指定了源;参数first2指定了目的。
注意到在范围first1...last -1中的元素被拷贝。
函数模版copy的定义包含在头文件algorithm中,因此,在使用函数copy时,程序必须包含如下语句:
#include <algorithm>
函数copy的工作流程如下:
考虑如下的语句
int intArray[] = {5, 6, 8, 3, 40, 36, 98, 29, 75};
该语句创建了9个组件的数组intArray,这里,intArray[0] = 5, intArray[1] = 6,等等。
语句:
vector<int> vecList(9);
创建了9个类型为vector的组件的空容器,其元素类型为int,
对于intArray,实际上是一个指针,包含数组的基地址。因此,intArray指向数组的第一个组件。intArray + 1指向数组的第二个组件,等等。
现在,考虑如下的语句:
copy(intArray, intArray + 9, vecList.begin());
该语句复制从位置intArray开始的元素,从数组的第一个组件intArray开始,直到intArray + 9 -1(即为intArray + 8,其为数组intArray的最后一个元素)到容器vecList。(注:此处first1是intArray,last是intArray + 9,first2是vecList.begin())。执行copy后,vecList的内容如下:
vecList = {5, 6, 8, 3, 40, 36, 98, 29, 75};
接着,考虑如下语句:
copy(intArray + 1, intArray + 9, intArray);
此处,first1为intArray + 1,即first1指向数组intArray的第二个元素位置,last为intArray + 9。同时,first2为intArray;即first2指向数组intArray的第一个元素位置。因此,第二个数组元素复制到第一个数组组件,第三个数组元素到第二个数组组件,等等。当上面的语句执行后,intArray内容为:
intArray[] = {6, 8, 3, 40, 36, 98, 29, 75, 75};
很明显,数组intArray中的元素左移了一个位置。
考虑如下语句:
copy(vecList.rbegin() + 2, vecList.rend(), vecList.rbegin());
其中rbegin(reverse begin)函数返回容器中最后一个元素的指针。用于以反向来对容器中元素进行处理。因此,vecList.rbegin() + 2返回容器vecList中倒数第三个元素的指针。相似地,rend(reverse end)函数返回容器中指向第一个元素的指针。
所以,上边的语句把容器vecList中的元素右移两个位置。上述语句执行完后,容器vecList中的内容如下:
vecList = {5, 6, 5, 6, 8, 3, 40, 36, 98}
以下对一种特殊类型的iterator——ostream iterators进行描述,这些ostream iterators可以很好的利用copy函数来拷贝一个容器的元素到输出设备。
ostream迭代器和copy函数
输出容器内容的一种方法就是使用for循环,函数begin用来初始化for循环的控制变量,函数end用来设置上限。另一种方法是使用copy函数来输出容器元素。对于这种情况,类型为ostream的迭代器指定目标(destination)。当我们创建一个ostream类型的迭代器,我们也指定了迭代器将输出的元素类型。
下列语句展示了如何创建一个类型为int的ostream迭代器:
ostream_iterator<int> screen(cout, " ");
该语句创建screen作为ostream迭代器(元素类型为int)。迭代器screen有两个参数:对象cout和空格(a space)。因此,迭代器screen使用对象cout来初始化。当该迭代器输出元素时,它们通过空格来分开。
语句:
copy(intArray, intArray + 9, screen);
输出intArray中的元素到屏幕上。
相似地,语句:
copy(vecList.begin(), vecList.end(), screen);
输出容器vecList里的元素到屏幕。
我们将频繁的使用copy函数,通过ostream迭代器来输出容器中的元素。
当然,我们可以直接在copy函数中指定一个ostream迭代器,因此对于上面的例子,可以直接写为:
copy(vecList.begin(), vecList.end(), ostream_iterator<int>(cout, " "));
最后,语句:
copy(vecList.begin(), vecList.end(), ostream_iterator<int>(cout, ","));
表示输出vecList中的元素,并以逗号(",")隔开。
以下举例说明如何使用copy函数和ostream迭代器:
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator> using namespace std; int main()
{
int intArray[] = {5, 6, 8, 3, 40, 36, 98, 29, 75}; vector<int> vecList(9); ostream_iterator<int> screen(cout, " ");
cout << "intArray: ";
copy(intArray, intArray + 9, screen);
cout << endl; copy(intArray, intArray + 9, vecList.begin());
cout << "vecList: ";
copy(vecList.begin(), vecList.end(), screen);
cout << endl; copy(intArray + 1, intArray + 9, intArray);
cout << "After shifting the elements " << "one position to the left, " << endl
<< " int Array: ";
copy(intArray, intArray + 9, screen);
cout << endl;
copy(vecList.rbegin() + 2, vecList.rend(), vecList.rbegin());
cout << "After shifting the elements "
<< "down by two positions, " << endl
<< " vecList: ";
copy(vecList.begin(), vecList.end(), screen);
cout << endl; return 0;
}
输出为:
STL中copy算法的更多相关文章
- STL中的算法
STL中的所有算法(70个) 参考自:http://www.cppblog.com/mzty/archive/2007/03/14/19819.htmlhttp://hi.baidu.com/ding ...
- STL中的算法小结
()要运用STL的算法,首先必须包含头文件<algorithm>,某些STL算法用于数值处理,因此被定义于头文件<numeric> ()所有STL算法都被设计用来处理一个或多个 ...
- STL中heap算法(堆算法)
①push_heap算法 以下是push_heap算法的实现细节.该函数接收两个迭代器,用来表现一个heap底部容器(vector)的头尾,而且新元素已经插入究竟部的最尾端. template ...
- STL中常用算法
一.排序 sort sort(first_pointer,first_pointer+n,cmp) 默认为升序 若要使用降序,自行写cmp 函数 bool cmp(int a,int b){ retu ...
- STL中的所有算法(70个)
STL中的所有算法(70个)----9种类型(略有修改by crazyhacking) 参考自: http://www.cppblog.com/mzty/archive/2007/03/14/1981 ...
- 有一个问题关于stl函数中的算法问题
是不是stl中的算法函数中参数只要是和函数相关的就是函数对象和谓词?
- STL中的查找算法
STL中有很多算法,这些算法可以用到一个或多个STL容器(因为STL的一个设计思想是将算法和容器进行分离),也可以用到非容器序列比如数组中.众多算法中,查找算法是应用最为普遍的一类. 单个元素查找 1 ...
- 快速排序及STL中的sort算法
快速排序基本思想是,对待排序序列进行划分(Partition),一次划分,选择一个元素作为枢轴,然后将所有比枢轴小的元素放到枢轴的左边,将比枢轴大的元素放到枢轴的右边.然后对该枢轴划分的左右子序列分别 ...
- STL中的排序算法
本文转自:STL中的排序算法 1. 所有STL sort算法函数的名字列表: 函数名 功能描述 sort 对给定区间所有元素进行排序 stable_sort 对给定区间所有元素进行稳定排序 ...
随机推荐
- c++ 静态多态与动态多态
多态polymorphism是指具有多种形态的情况,它能根据单一的标记关联不同的行为.多态是面向对象程序设计的基础.在面向对象程序设计中的多态是一种运行时的多态.C++中有两种多态,称为动多态(运行时 ...
- Noip2013调试技巧
关于调试技巧,个人觉得还是很重要的,于是把自己之前写过的总结拿出来,修修补补再复习一下. F7 单步跟踪法 这是大家都最常用的调试方法,可以一步一步去跟踪程序的运行方向,以及各种变量的变化情况,当发现 ...
- ashx页面中context.Session["xxx"]获取不到值的解决办法
在 aspx和aspx.cs中,都是以Session["xxx"]="aaa"和aaa=Session["xxx"].ToString()进 ...
- iOS面试题04-runtime
runtime/KVO等面试题 1.KVO内部实现原则 回答:1>KVO是基于runtime机制实现的 2>当某个类的对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个 ...
- hibernate通过配置文件生成数据库信息
hibernate可以通过配置文件在数据库生成相应的数据库信息.也可以把数据库的信息生成相应的代码(实体类操作类和映射文件) 下面是通过代码默认对hibernate.cfg.xml信息在数据库生成信息 ...
- IWebBrowser隐藏滚动条
刚才在项目里看到一个IWebBrowser2,竟然需要通过MoveWindow的方式把滚动条遮挡,如果要缩小IWebBrowser2控件的显示大小呢?这种方法至少我用不习惯,起码也得从源头解决这样的问 ...
- C#操作Office.word(三)
前面两篇博客讲解了怎么通过程序控制word的生成,包括生成文字.添加表格.添加图片等.这篇博客主要说一下怎么把word图片转换成pdf. using System; using System.Coll ...
- Lucence.Net+添加关键词+分页+排序
1.使用queryparser完成解析搜索请求 2.基本格式如: QueryParser parser=new QueryParser("字段名称","分析器实例&quo ...
- CSS样式的优先机制
链接:http://www.cnblogs.com/xugang/archive/2010/09/24/1833760.html 又抓到虫子了:IE中奇怪的应用CSS的BUG:http://www.c ...
- codeforces 417D. Cunning Gena 状压dp
题目链接 D. Cunning Gena time limit per test 1 second memory limit per test 256 megabytes input standard ...