STL算法分析之Copy()算法

本文主要分析了STL中的Copy算法,该算法将指定区间内的元素复制到另一个目标区间。介绍了函数原型、参数及返回值,并通过案例解析Copy算法在容器内部的工作原理,帮助读者理解其操作模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在看SGI STL源码的时候,毕竟会碰到很多的算法,不理解这些算法对我们的阅读产生了很大的影响,现在先来分析下几个已经碰到的了的算法。第一个Copy()算法。

Copy算法说起来很简单就是将迭代器里面的 [first,last]区间里的元素赋值到指定的 result 指定的区间里面去[result,result+(last-first)]。看下函数原型 并且解析下。

[cpp]  view plain  copy
  1. template<class InputIterator, class OutputIterator>  
  2.    OutputIterator copy(  
  3.       InputIterator _First,   
  4.       InputIterator _Last,   
  5.       OutputIterator _DestBeg  
  6.    );  

参数

_First, _Last
指出被复制的元素的区间范围[ _First,_Last).
_DestBeg 
指出复制到的目标区间起始位置

返回值

返回一个迭代器,指出已被复制元素区间的最后一个位置。。

接下来我将放上一个Copy()的使用案例,并且对代码里面的细节,以及Copy()算法在容器内部的运动情况做一个详解。

#include <iostream>
#include <algorithm>
#include <vector>
int main()
{
	int myints[] = { 1,2,3,4,5,6,7,8,9,10 };
	std::vector<int> myvector;
	std::vector<int>::iterator it;


	myvector.resize(10);   /*必须为Vector分配空间,如果不分配空间会爆炸的*/


	//copy用法一:
	//将数组myints中的十个元素复制到myvector容器中


	copy(myints, myints + 10, myvector.begin());
	std::cout << "myvector contains: ";
	for (it = myvector.begin(); it != myvector.end(); ++it)
	{
		std::cout << " " << *it;
	}
	std::cout << std::endl;
	return 0;
}


首先这个没啥说的,就是把这个数组Copy到了Vector里面去。 Copy代码到你的VS2013里面跑一下就知道了。接下来我们说下copy元素并且插入到指定位置的时候,Vector中指针的运作。先通过观察数据变化来总结规律

#include <iostream>
#include <algorithm>
#include <vector>
int main()
{
	int myints[] = { 1,2,3,4,5,6,7,8,9,10 };
	std::vector<int> myvector;
	std::vector<int>::iterator it;

	myvector.resize(10);   /*必须为Vector分配空间,如果不分配空间会爆炸的*/

	//copy用法二:
	//将数组myints中的元素向左移动一位
	std::copy(myints + 1, myints +10, myints);
	
	std::cout << "myints contains: ";
	for (size_t i = 0; i < 10; ++i)
	{
		std::cout << " " << myints[i];
	}
	std::cout << std::endl;

	return 0;
}

我们将移动的值改为2.


在来测试一个值,让myints+5。


明眼的朋友一定都找出规律了,但是还是得来画图说明下copy在Vector中的指针的运作模式。直接以第三个myints+5的运作为例说明,其他的都是相同原理,举一反三。


多早几次实验,总结数据就会得出这个规律。这就是STL 当中的copy()算法。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值