前言:
所谓变序类算法,就是在一个容器里面,把原有的顺序改变,在这里主要是介绍几个算法,reverse翻转,rotate旋转次序以及random_shuffle随机化打乱顺序。
reverse
template<class BidirectionalIterator>
void reverse(
BidirectionalIterator _First,
BidirectionalIterator _Last
);
reverse(a,b) 反转a b之间的元素 a为起始地址 b为末尾的下一个地址,也就是翻转容器内的元素,并装入原来的容器当中
源码:
template <class BidirectionalIterator>
void reverse (BidirectionalIterator first, BidirectionalIterator last)
{
while ((first!=last)&&(first!=--last)) {
std::iter_swap (first,last);
++first;
}
}
举个例子
// reverse algorithm example
#include <iostream> // std::cout
#include <algorithm> // std::reverse
#include <vector> // std::vector
int main () {
std::vector<int> myvector;
// set some values:
for (int i=1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9
std::reverse(myvector.begin(),myvector.end()); // 9 8 7 6 5 4 3 2 1
// print out content:
std::cout << "myvector contains:";
for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
return 0;
}
还有个**reverse_copy(first,end,result)**算法,跟前面唯一不同的就是把翻转后的元素放入目的容器
template <class BidirectionalIterator, class OutputIterator>
OutputIterator reverse_copy (BidirectionalIterator first,
BidirectionalIterator last, OutputIterator result);
rotate
template <class ForwardIterator>
ForwardIterator rotate (ForwardIterator first, ForwardIterator middle,
ForwardIterator last);
rotate(beg,newBeg,end)将区间[beg,end)内的元素进行旋转,执行后*newBeg成为新的第一元素;
源码:
template <class ForwardIterator>
void rotate (ForwardIterator first, ForwardIterator middle,
ForwardIterator last)
{
ForwardIterator next = middle;
while (first!=next)
{
swap (*first++,*next++);
if (next==last) next=middle;
else if (first==middle) middle=next;
}
}
举个例子:
// rotate algorithm example
#include <iostream> // std::cout
#include <algorithm> // std::rotate
#include <vector> // std::vector
int main () {
std::vector<int> myvector;
// set some values:
for (int i=1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9
std::rotate(myvector.begin(),myvector.begin()+3,myvector.end());
// 4 5 6 7 8 9 1 2 3
// print out content:
std::cout << "myvector contains:";
for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
return 0;
}
还有一个rotate_copy,跟前面的也是,把结果输出到目的容器,其他用法都一样,没区别。
template <class ForwardIterator, class OutputIterator>
OutputIterator rotate_copy (ForwardIterator first, ForwardIterator middle,
ForwardIterator last, OutputIterator result);
random_shuffle
//源码
template <class RandomAccessIterator, class RandomNumberGenerator>
void random_shuffle (RandomAccessIterator first, RandomAccessIterator last,
RandomNumberGenerator& gen)
{
iterator_traits<RandomAccessIterator>::difference_type i, n;
n = (last-first);
for (i=n-1; i>0; --i) {
swap (first[i],first[gen(i+1)]);
}
}
//generator by default (1)
template <class RandomAccessIterator>
void random_shuffle (RandomAccessIterator first, //RandomAccessIterator last);
specific generator (2)
template <class RandomAccessIterator, class RandomNumberGenerator>
void random_shuffle (RandomAccessIterator first, RandomAccessIterator last,
RandomNumberGenerator&& gen);
在STL中,函数random_shuffle()用来对一个元素序列进行随机排序。有个注意点就是对于set、map(自带排序功能)的容器或者一下非连续性容器无法使用。别人写的精彩博客
一般来说,如果只是仅仅打乱容器顺序,下面给出操作:
# include <random>
srand(unsigned(time(0))); //设置种子
random_shuffle(vector.begin(),vector.end(),[](int i)->int{
return rand()%i;
})