std::
random_shuffle
函数模板 <algorithm>
C++98 |
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); |
C++11 |
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); |
随机重新排列范围内的元素
随机重新排列[first,last)范围内的元素。
该函数将每个元素的值与其他随机选取的元素的值进行交换。
函数gen在提供时确定在每种情况下选择哪个元素。否则,该函数将使用一些未指定的随机性来源。
要指定一个统一的随机生成器,如<random>中定义的,请参见shuffle。
这个函数模板(2)的行为相当于:
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)]);
}
} |
☲ 参数
-
first, last
-
指向要打乱序列的初始和最终位置的随机访问迭代器。
使用的范围是[first,last),
它包含first和last之间的所有元素,包括first指向的元素,但不包括last指向的元素。
-
gen
-
一元函数,接受一个实参并返回一个值,可转换为(或者从)迭代器使用的相应的 difference type。
函数应该返回一个小于其实参的非负值。
它可以是函数指针,也可以是函数对象。
随机访问迭代器(RandomAccessIterator)应该指向一个定义了swap的类型,并交换其实参的值。
☉ 返回值
none.
☣ 示例
// random_shuffle example
#include <iostream> // std::cout
#include <algorithm> // std::random_shuffle
#include <vector> // std::vector
#include <ctime> // std::time
#include <cstdlib> // std::rand, std::srand
// random generator function:
int myrandom (int i) { return std::rand()%i;}
int main () {
std::srand ( unsigned ( std::time(0) ) );
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
// using built-in random generator:
std::random_shuffle ( myvector.begin(), myvector.end() );
// using myrandom:
std::random_shuffle ( myvector.begin(), myvector.end(), myrandom);
// 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;
} |
可能输出:
myvector contains: 3 4 1 6 8 9 2 7 5
✥ 复杂度
first and last 之间的距离线性减1:获取随机值并交换元素。
⇄ 数据竞争
在[first,last)范围内的对象被修改。
☂ 异常安全性
如果任何随机数生成、元素交换或迭代器上的操作抛出,则抛出。
注意,无效的参数会导致未定义的行为。
🍄 另请参阅
rotate |
旋转元素(函数模板) |
reverse |
反转元素(函数模板) |
generate |
用函数生成范围的值(函数模板) |
swap |
交换两个对象的值(函数模板) |