c++ - 获取 unordered_set 中最右边的元素(或反向打印内容)

标签 c++ set unordered-set

我有一个 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 复制到 vector 中是可行的,但这当然需要时间。我怎样才能通过更聪明的方式实现这一目标?我注意到我也不能做类似的事情:

unordered_set <long>::iterator it = valueSet.end();
//operator -- does not exist here in the unordered_set
it--;

最佳答案

根据我从您的评论中收集到的内容,使用 std::bitset或其动态对应物 boost::dynamic_bitset放在这里应该是合适的。插入和删除的复杂度为 O(1),确定最大元素的复杂度为 O(N)(通过线性搜索)。有人甚至可能会争辩说,找到最大值的分摊时间为 O(1),因为您最多必须执行与删除操作一样多的搜索步骤。

关于c++ - 获取 unordered_set 中最右边的元素(或反向打印内容),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7691303/

相关文章:

c++ - 我应该总是在 C++ 中初始化类的每个数据成员吗?

set - 对字符串进行分区的所有方法

java - Getter 用于在 dynamoDB 中增值

c++ - 如何将数组插入无序集中?

c++ - 模板中 sizeof 的 constexpr 无法编译

C++指针树模板问题

javascript - JavaScript 中有 Set 字面量吗?

c++ - 哈希函数错误,c++

C++ std::unordered_set SIGFPE 异常

c++ - OpenGL 类型 GLint、Glbyte... 到 C++ int32_t、int8_t... 映射