首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >统一C++ mt19937 SequenceContainer的包装器

统一C++ mt19937 SequenceContainer的包装器
EN

Code Review用户
提问于 2019-06-18 01:22:38
回答 1查看 265关注 0票数 4

考虑到下面的接口

代码语言:javascript
复制
EasyRandom<unsigned int> prng(a, b);
auto x = prng();   // scalar
auto v = prng(10); // vector

我写了下面的课:

代码语言:javascript
复制
// https://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution
template <typename T = unsigned int>
class EasyRandom
{
private:
  std::random_device rd;
  std::unique_ptr<std::mt19937> gen;
  std::unique_ptr<std::uniform_int_distribution<T>> dist;

public:
  EasyRandom(T a, T b)
  {
    gen = std::make_unique<std::mt19937>(rd());
    dist = std::make_unique<std::uniform_int_distribution<T>>(a, b);
  }

  T operator()() { return (*dist)(*gen); }

  std::vector<T> operator()(size_t n)
  {
    std::vector<T> v;
    for (; n > 0; v.push_back(operator()()), --n);
    return v;
  }
};

我还有几个具体问题:

  1. 有没有一种不使用指针来实例化EasyRandom的方法?
  2. 是否可以将operator()(size_t n)更改为返回任何用户指定的SequenceContainer (例如向量、列表、deque),而不是将其硬编码到特定的实现(例如std::vector)?
EN

回答 1

Code Review用户

回答已采纳

发布于 2019-06-18 05:02:08

gendist不需要成为指针。只需将它们声明为成员,并使用构造函数中的成员初始化程序列表来初始化它们。

代码语言:javascript
复制
std::random_device rd;
std::mt19937 gen;
std::uniform_int_distribution<T> dist;

EasyRandom(T a, T b): gen(rd()), dist(a, b) {
}

在返回向量的operator()中,可以为向量预留空间,以避免插入(v.reserve(n))期间的内存重新分配。虽然ints没有问题,但如果使用emplace_back而不是push_back,则可以避免非简单类型的值的潜在额外副本。

第二个问题与主题无关(代码未实现)。

票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/222495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档