这个问题与此有关 this one,更准确地说是this回答它。
这里有:我有一个无符号整数的C ++ / TR1 unordered_set U
(粗基数100-50000,粗略值范围0到10 ^ 6)。
给定基数N
,我想尽可能快地迭代N
随机但是
U
的独特成员。 N
没有典型值,但它应该
小N
快速工作。
更详细地说,这里的“随机性”的概念是
两个调用应该产生一些不同的子集 - 越不同,
越好,但这不是太关键。我会...对连续感到高兴
(或缠绕连续)
N
U
成员的块,只要块的起始索引是随机的。
以相同的成本不连续更好,但主要关注的是速度。 U
更改
温和地,但不断地在呼叫之间(在呼叫之间插入/删除大约0-10个元素)。
我走了多远:
琐碎的方法:
选择随机索引i
,使(i+N-1) < |U|
。
获取it
到U.begin()
的迭代器,使用i
将其提前it++
次,然后启动
子集上的实际循环。优点:容易。缺点:浪费++'es。
铲斗进场(这是我从上面的链接得到的“新”):
如上所述选择i
,找到第b
个元素所在的存储区i
,获取local_iterator lit
到U.begin(b)
,lit
通过lit++
推进i
,直到我们点击U
的第lit
个元素,然后继续N
递增lit
i
次。U
次。如果我们到达桶的末端,
我们从下一个桶的开头继续i
。如果我想成功的话
更随机我可以完全随机选择U
并包裹桶。
我的开放性问题:
i
- 元素,迭代器就会进入i
?这样可以省去我
铲斗边界控制等对我而言相当
初学者,标准的前向迭代器应该知道如何,这似乎是不可思议的
在U
项时继续遍历{{1}},但当我自己找到{{1}}项时,
除了通过上面的第2点之外,不应该遍历{{1}}。答案 0 :(得分:8)