我有一个自定义容器,通过唯一ID(简单的int64)提供对其元素的访问。此ID不是索引创建者,因此容器的用户不应该关心内部元素的顺序。
我已经实现了最简单的前向迭代器,它提供operator++
能够使用带有基于范围的for循环的容器。
但是现在,我希望通过生成随机数并使用std::next
从容器中获取随机元素,所有这些都在常量时间内,因此前向迭代器是不够的,因为它将调用operator++
N次引入线性复杂性。为了实现恒定速度,我必须提供operator+=
,它将使我的前向迭代器成为一种随机访问迭代器(容器能够提供恒定的时间访问)。我在这里纠正吗?如果是这样,它引入了 order 的概念,它并不适用于我的容器。
因此,我需要恒定时间随机访问,但没有像vector
中那样严格的顺序。我逻辑中的错误在哪里?
答案 0 :(得分:3)
您修改container::iterator
以使您可以访问“随机”元素的策略非常简单。因为您始终会在0
和container::size()
之间选择一个数字,并将其添加到container::begin()
,所以您需要保留container
,而不仅仅是迭代器
您应该做的是添加成员template< class Generator > container::reference container::random_element( Generator& g )
,委派给std::uniform_int_distribution
来挑选元素,并将container::iterator
保留为ForwardIterator(或可能是{{} 3}})。