C++标准库---旋转元素rotate()&rotate_copy()

旋转元素次序

rotate(beg,newBeg,end)

将区间[beg,end)内的元素进行旋转,执行后*newBeg成为新的第一元素;

调用者必须确保newBeg是区间[beg,end)内的一个有效位置,否则会引发未定义的行为;

复杂度:线性


代码示例:

#include"fuzhu.h"

using namespace std;

int main()
{
	vector<int> coll;

	INSERT_ELEMENTS(coll,1,9);

	PRINT_ELEMENTS(coll,"coll: ");

	rotate(coll.begin(),coll.begin()+1,coll.end());//begin()+1 first

	PRINT_ELEMENTS(coll,"one left: ");

	rotate(coll.begin(),coll.end()-2,coll.end());//end-2 first

	PRINT_ELEMENTS(coll,"two right: ");

	rotate(coll.begin(),find(coll.begin(),coll.end(),4),coll.end());// 4 first

	PRINT_ELEMENTS(coll,"4 first: ");

	system("pause");
	return 0;
}

运行结果:



运行分析:

程序中可以使用正偏移量将元素向左起点方向旋转,也可以使用负偏移量将元素向右终点方向旋转。不过这只对随机存取迭代器有用,如果不是这类迭代器,就得使用advance(),下面示例。


复制并同时旋转元素


rotate_copy(sourceBeg,newBeg,sourceEnd,destBeg)


这是copy()和rotate()的组合;

将源区间[sourceBeg,sourceEnd)内的元素复制到“以destBeg起始的目标区间”中,同时旋转元素,是newBeg成为新的第一元素;

返回目标区间内最后一个被复制元素的下一位置;

调用者必须确保newBeg是区间[beg,end)内的一个有效位置,否则会引发未定义的行为;

调用者必须确保目标区间足够大,要不就得使用插入型迭代器;

源区间和目标区间两者不可重迭

复杂度:线性


代码示例:

#include"fuzhu.h"

using namespace std;

int main()
{
	set<int> coll;

	INSERT_ELEMENTS(coll,1,9);

	PRINT_ELEMENTS(coll,"coll: ");

	set<int>::iterator pos=coll.begin();

	advance(pos,1);

	cout<<"coll +1:";
	rotate_copy(coll.begin(),pos,coll.end(),ostream_iterator<int>(cout," "));
	cout<<endl;

	PRINT_ELEMENTS(coll,"coll: ");

	pos=coll.end();

	advance(pos,-2);

	cout<<"coll -2:";
	rotate_copy(coll.begin(),pos,coll.end(),ostream_iterator<int>(cout," "));
	cout<<endl;

	PRINT_ELEMENTS(coll,"coll: ");

	cout<<"coll 4 first:";
	rotate_copy(coll.begin(),coll.find(4),coll.end(),ostream_iterator<int>(cout," "));
	cout<<endl;

	system("pause");
	return 0;
}

运行结果:

C++标准库---旋转元素rotate()&rotate_copy()_第1张图片


注意:

必须使用advance()来改变迭代器本身的值,因为双向迭代器不支持operator+;

必须使用find()成员函数,而非find()算法,因为set的成员函数算法性能更好.

你可能感兴趣的:(算法,迭代器,STL,rotate,rotate_copy)