当前位置: 首页 > 知识库问答 >
问题:

std::shuffle的可能实现

段恩
2023-03-14

这是一个算法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))]);
     }
 }

>

为什么使用声明在循环体内部而不是外部?将其留在内部(迭代)会影响性能吗?谢谢!

共有1个答案

权黎昕
2023-03-14

为什么算法需要对生成器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)个人备忘记事本。