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



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

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

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

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

您修改container::iterator以允许您访问"随机"元素的策略是不合时宜的。因为你总是在0container::size()之间选择一个数字,并将其添加到container::begin(),所以你需要保留container,而不仅仅是一个迭代器

相反,您应该做的是添加一个成员template< class Generator > container::reference container::random_element( Generator& g ),委托给std::uniform_int_distribution来选择元素,并将container::iterator保留为前向迭代器(或可能是双向迭代器)。

最新更新