【发布时间】:2011-12-03 05:27:33
【问题描述】:
我有一个 unordered_set 如下:
unordered_set <long> valueSet;
/*the following insertion is done in order (from 1 to 10000),
*unordered_set will keep the elements based on the insertion order, right,
*just like in a vector ?
**/
for(long i = 1; i <= 10000;++i)
{
valueSet->insert(i);
}
然后我执行了另一个函数,删除了 unordered_set 中大约 85% 的元素。 (要擦除的元素取决于该函数的逻辑,但并不重要,因为所有元素最初都是按顺序插入的。
现在,在删除 unordered_set 中的一些元素之后,我想打印仍然保留在 unordered_set 中的最后一个元素。例如,元素 9997、9998、9999 和 10000 已被擦除,因此该集合中剩余的最大元素是 9996。
如何做到这一点?
如果使用基本套装,我可以执行以下操作:
set <long>::reverse_iterator it = valueSet.rbegin();
cout << *it << endl;
在一个集合中,我们有 reverse_iterator 和 rbegin(),但这在 unordered_set 中不存在。我之所以没有基本设置是因为我需要将元素大小放大到 10^8。使用常规集(基于红黑树)确实会降低性能(尤其是在处理插入和删除时)。 我怎样才能做到这一点?将最后剩余的 unordered_set 复制到向量中会起作用,但这当然需要时间。我怎样才能通过使用更智能的方式来实现这一目标?我注意到我也不能做类似的事情:
unordered_set <long>::iterator it = valueSet.end();
//operator -- does not exist here in the unordered_set
it--;
【问题讨论】:
-
你想吃你的蛋糕。当您从 set 切换到 unordered_set 时,您放弃了某些好处,您无法收回这些好处。
-
还有其他替代数据结构可以让我这样做吗?我只想得到最后一个元素,而不是按顺序打印所有元素(如集合)。例如来自 Boost 或 Google 的其他数据结构实现?
-
最后一个元素是指“最近添加的”吗?这很简单,只需包装现有的数据结构,但缓存最近添加的元素。如果你还有别的意思,你需要一棵树。
-
我刚刚在您的代码中注意到这条注释:“unordered_set 将根据插入顺序保留元素,对吧,就像在向量中一样?” 不,它不会.
-
@all_by_grace:它证明了它在特定情况下保留了顺序,它不证明它作为一般规则这样做。例如:ideone.com/LNwDn
标签: c++ set unordered-set