简单的程序诠释C++ STL算法系列之十六:iter_swap

原创 2012年03月27日 00:20:07

      上文中阐述了元素交换算法swap以及容器中swap成员函数的使用,尤其是通过vector成员函数的交换技巧实现容器内存的收缩,今天,我们要看到的是另一个变易算法,迭代器的交换算法iter_swap,顾名思义,该算法是通过迭代器来完成元素的交换。首先我们来看看函数的原型:

函数原型:

template<class ForwardIterator1, class ForwardIterator2>
   void iter_swap(
      ForwardIterator1 _Left,
      ForwardIterator2 _Right
   );


参数说明:

        _Left,_Right指向要交换的两个迭代器

程序示例:

        在泛型编程里面,iterator被称为“泛型指针”,因此我们可以通过iterator作为指针来交换两个数组的元素,为了展示swap和iter_swap的区别,在下面这个示例中,我们分别通过这两个算法来实现数组元素的简单交换。

/*******************************************************************
 * Copyright (C) Jerry Jiang
 *               
 * File Name   : iter_swap.cpp
 * Author      : Jerry Jiang
 * Create Time : 2012-3-26 23:22:18
 * Mail        : jbiaojerry@gmail.com
 * Blog        : http://blog.csdn.net/jerryjbiao 
 *               
 * Description : 简单的程序诠释C++ STL算法系列之十六                   
 *               变易算法 : 迭代器交换iter_swap
 *               
 ******************************************************************/

#include <iostream>
#include <algorithm>
#include <iterator>

using namespace std;
int main()
{
	//初始化数组
	int b[ 9 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	ostream_iterator< int > otpt( cout, " " );
	
	//通过copy+ostream_iterator的方式输出原始数组
	cout << "Array a contains:\n ";
	copy( b, b + 9, otpt );

	//调用iter_swap交换b[0]和b[1]
	iter_swap( &b[0], &b[1] );

	//调用swap交换b[2]和b[3],展示两者的区别
	swap( b[2], b[3] );

	//通过copy+ostream_iterator的方式输出交换后的数组
	cout << "\n Array a after swapping :\n ";
	copy( b, b + 9, otpt );
	cout << endl;

	return 0;
}

上例中,迭代器是作为泛型指针的形式来实现数组元素的交换,现在我们通过iter_swap算法来实现同一种容器之间元素的交换以及不同容器之间的元算交换。

/*******************************************************************
 * Copyright (C) Jerry Jiang
 *               
 * File Name   : iter_swap02.cpp
 * Author      : Jerry Jiang
 * Create Time : 2012-3-26 23:58:29
 * Mail        : jbiaojerry@gmail.com
 * Blog        : http://blog.csdn.net/jerryjbiao 
 *               
 * Description : 简单的程序诠释C++ STL算法系列之十六                   
 *               变易算法 : 迭代器交换iter_swap
 *
 ******************************************************************/

#include <vector>
#include <deque>
#include <algorithm>
#include <iostream>
#include <ostream>

using namespace std;

int main( )
{
   deque<int> deq1;
   deque<int>::iterator d1_Iter;
   ostream_iterator< int > otpt( cout, " " );

   deq1.push_back ( 2 );
   deq1.push_back ( 4 );
   deq1.push_back ( 9 );

   //通过copy输出队列初始序列
   cout << "The deque is:\n";
   copy(deq1.begin(), deq1.end(), otpt);

   //通过iter_swap算法交换队列中第一个和最后一个元素
   iter_swap(deq1.begin() , --deq1.end());

   //输出通过iter_swap交换后的队列
   cout << "\n\nThe deque of CInts with first & last elements swapped is:\n ";
   copy(deq1.begin(), deq1.end(), otpt);

   //通过swap交换算法还原队列中的元素
   swap (*deq1.begin(), *(deq1.end()-1));

   cout << "\n\nThe deque of CInts with first & last elements swapped back is:\n ";
   copy(deq1.begin(), deq1.end(), otpt);
   cout << endl;
   
   cout << "*********************************" << endl;


   // 通过iter_swap交换vector和deque两个不同容器中的元素
   vector <int> v1;
   deque <int> deq2;

   //初始化容器v1
   for ( size_t i = 0 ; i <= 3 ; ++i )
   {
      v1.push_back( i );
   }

   //初始化队列deq2
   for ( size_t ii = 4 ; ii <= 5 ; ++ii )
   {
      deq2.push_back( ii );
   }

   cout << "\nVector v1 is : " ;
   copy(v1.begin(), v1.end(), otpt);
   
   cout << "\nDeque deq2 is : " ;
   copy(deq2.begin(), deq2.end(), otpt);
   cout << endl;
   
   //交换容器v1和队列deq2的第一个元素
   iter_swap( v1.begin(), deq2.begin() );

   cout << "\n\nAfter exchanging first elements,\n vector v1 is:  " ;
   copy(v1.begin(), v1.end(), otpt);

   cout << " \n deque deq2 is: ";
   copy(deq2.begin(), deq2.end(), otpt);

   cout << endl;

   return 0;
}

*******************************************************************************************************************************

C++经典书目索引及资源下载:http://blog.csdn.net/jerryjbiao/article/details/7358796

********************************************************************************************************************************


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

简单的程序诠释C++ STL算法系列之十五:swap

相信大家看到swap这个词都一定不会感到陌生,甚至会有这样想法:这不就是简单的元素交换嘛。的确,swap交换函数是仅次于Hello word这样老得不能老的词,然而,泛型算法东风,这个小小的玩意儿却在...

简单的程序诠释C++ STL算法系列之十八:transform

前篇我们已经了解了一种区间元素交换swap_ranges函数,现在我们再来学习另外一种区间元素交换transform。该算法用于实行容器元素的变换操作。有如下两个使用原型,一个将迭代器区间[first...

MySQL 使用自增ID主键和UUID 作为主键的优劣比较详细过程(从百万到千万表记录测试)

测试缘由  一个开发同事做了一个框架,里面主键是uuid,我跟他建议说mysql不要用uuid用自增主键,自增主键效率高,他说不一定高,我说innodb的索引特性导致了自增id做主键是效率最好的,为了...
  • mchdba
  • mchdba
  • 2016-08-27 17:44
  • 18496

C语言的一些细节总结

1)、类型比较和转换问题 short和int类型之间直接比较或转换都会出现内存错误;2)、判断文件是否结束时,可能存在回车换行文件并没真正介绍而内容已经结束了,需要用while (!feof(fp_s...

Linux多线程编程小结

1.Linux进程与线程 Linux进程创建一个新线程时,线程将拥有自己的栈(因为线程有自己的局部变量),但与它的创建者共享全局变量、文件描述符、信号句柄和当前目录状态。 Linux通过f...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)