从容器中获取随机元素,该元素在恒定时间内没有严格的元素顺序

时间:2018-01-23 15:17:08

标签: c++ iterator containers random-access

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

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

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

因此,我需要恒定时间随机访问,但没有像vector中那样严格的顺序。我逻辑中的错误在哪里?

1 个答案:

答案 0 :(得分:3)

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

您应该做的是添加成员template< class Generator > container::reference container::random_element( Generator& g ),委派给std::uniform_int_distribution来挑选元素,并将container::iterator保留为ForwardIterator(或可能是{{} 3}})。