【问题标题】:Obtaining random element from container which doesn't have strict element order in constant time在恒定时间内从没有严格元素顺序的容器中获取随机元素
【发布时间】:2018-07-02 11:17:55
【问题描述】:

我有一个自定义容器,它通过唯一 ID(简单的 int64)提供对其元素的访问。此 ID 不是索引悬停器,因此容器的用户不必关心内部元素的顺序。

我已经实现了最简单的前向迭代器,它提供了operator++ 以便能够将容器与基于范围的 for 循环一起使用。

但是现在,我想通过生成随机数并使用std::next从容器中获取随机元素,所有这些都是在恒定时间内完成的,所以前向迭代器是不够的,因为它的operator++将被调用N次引入线性复杂。为了实现恒定速度,我必须提供operator+=,这将使我的前向迭代器成为一种随机访问迭代器(容器能够提供恒定时间访问)。我在这里正确吗?如果是这样,它会引入一个 order 的概念,它并不真正适用于我的容器。

所以,我需要恒定时间随机访问,但不需要像vector 中的严格顺序,例如。我的逻辑错误在哪里?

【问题讨论】:

  • @Slava 编辑了问题
  • “随机访问”是否意味着您从容器中获取 any 元素,或者具有特定 id 的元素?
  • 如果您提供了operator++,您的容器是否已经有订单,即使它与存储的对象无关?
  • 在这种情况下,我可能会编写一些 random_element() 函数返回一个引用(或迭代器),而不用费心更改迭代器的实现。
  • 您可以使用 operator+= 的迭代器,它本身不是 RandomAccessiterator,并满足您的对恒定时间访问的要求。

标签: c++ iterator containers random-access


【解决方案1】:

您修改container::iterator 以使您能够访问“随机”元素的策略是单一的。因为您总是会在0container::size() 之间选择一个数字并将其添加到container::begin(),所以您需要保留container,而不仅仅是一个迭代器

您应该改为添加成员 template< class Generator > container::reference container::random_element( Generator& g ),委托给 std::uniform_int_distribution 来选择元素,并将 container::iterator 保留为 ForwardIterator(或可能是 BidirectionalIterator)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 2019-03-25
    相关资源
    最近更新 更多