旋转元素次序
rotate(beg,newBeg,end)
将区间[beg,end)内的元素进行旋转,执行后*newBeg成为新的第一元素;
运行结果:
运行结果:
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;
}
运行结果:
注意:
必须使用advance()来改变迭代器本身的值,因为双向迭代器不支持operator+;
必须使用find()成员函数,而非find()算法,因为set的成员函数算法性能更好.