调用者必须确保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的成员函数算法性能更好.