这是一个算法std::shuffle
来自https://en.cppreference.com/w/cpp/algorithm/random_shuffle:
template<class RandomIt, class URBG>
void shuffle(RandomIt first, RandomIt last, URBG&& g)
{
typedef typename std::iterator_traits<RandomIt>::difference_type diff_t;
typedef std::uniform_int_distribution<diff_t> distr_t;
typedef typename distr_t::param_type param_t;
distr_t D;
diff_t n = last - first;
for (diff_t i = n-1; i > 0; --i) {
using std::swap;
swap(first[i], first[D(g, param_t(0, i))]);
}
}
>
为什么使用声明在循环体内部而不是外部?将其留在内部(迭代)会影响性能吗?谢谢!
为什么算法需要对生成器URGB的转发引用
因为算法不想复制
生成器
,它通过引用传递,为了能够接受临时右值生成器
,它需要一个转发引用。
只要它不使用
std::forward
因为
生成器
不仅被调用一次。如果右值被转发,它的状态可能会在下一次调用之前被更改。
为什么using声明在循环体内部而不是外部?
这是所谓的std::swap两步,惯用的做法是在使用std::swap之后立即使用非限定的。将其放在循环内的好处是,其范围仅限于循环,而将其放在循环外可能会污染命名。
将其留在内部(迭代)会影响性能吗?
不
自相矛盾的是,如果有一个像std::shared_ptr的指针但是不参与资源所有权共享的指针是很方便的。换句话说,是一个类似std::shared_ptr但不影响对象引用计数的指针。这种类型的智能指针必须要解决一个std::shared_ptr不存在的问题:可能指向已经销毁的对象。一个真正的智能指针应该跟踪所值对象,在悬空时知晓,悬空(dangle)就是指针指向的对象不再存在。这就是对std::w
Creates a new sequence with the same elements as this one, in a randomized order. Signature Sequence.shuffle = function() { /*...*/ } Sequence.shuffle = function shuffle() { return new ShuffledSeque
正如我在标题中所述,我只是不明白为什么这个函数会抛出<code>std::bad_alloc</code>。如果我们看一看cppreference,所有三种可能的实现都是如有人所假设的,并且看起来没有特别需要动态内存分配。
洗牌算法 Shuffle a given array - GeeksforGeeks Given an array, write a program to generate a random permutation of array elements. This question is also asked as “shuffle a deck of cards” or “randomize a
描述 (Description) 方法shuffle()使列表的项目随机化。 语法 (Syntax) 以下是shuffle()方法的语法 - shuffle (lst ) Note - 此函数不能直接访问,因此我们需要导入shuffle模块,然后我们需要使用随机静态对象调用此函数。 参数 (Parameters) lst - 这可以是列表或元组。 返回值 (Return Value) 此方法不返
Android-shuffle 是Android平台上一个GTD(GettingThingsDone)个人备忘记事本。