【问题标题】:Get Last element from unordered_set [closed]从 unordered_set 中获取最后一个元素 [关闭]
【发布时间】:2013-06-05 14:01:38
【问题描述】:

我需要从 unordered_set 中获取最后一个元素,并且它必须使用 unordered_set,而不是任何其他类。 (主要是因为我要修改很多已经完成的代码)但是我一直在寻找唯一可能的方法是迭代它并保存元素然后返回它。但是在大集合中它太慢了。除此之外,我试过了,但没有用。

unordered_set <int>::iterator it = frames.end();
--it;

我收到以下错误: "'--it' 中的 'operator--' 不匹配"

它之所以有用主要是因为这个,它以“堆栈”的方式存储数据,如下所示:

unordered_set<int> s;
s.insert(9);
s.insert(4);
s.insert(8);
s.insert(0);
s.insert(1);

unordered_set<int>::iterator it = s.end();
for( it = s.begin();  it!= s.end(); ++it )
    cout << *(it) << " ";

它打印:“1 0 8 4 9”

所以“最后一个”元素总是 9,它是插入的“第一个”元素,正如我之前所说的以“堆栈”方式。

有什么改进的办法吗?

【问题讨论】:

  • 定义 unordered 集合的“最后一个”元素是什么。
  • “最后一个”元素到底是什么意思?没有保证的顺序(因此得名)......
  • @templatetypedef:我相信unordered_set 只有前向迭代器(ideone.com/HmSbD3)。
  • 简短的回答是,如果您需要/想要这样做,您可能想要使用 unordered_set 以外的其他东西。访问最后一个迭代器的唯一方法是遍历所有其他迭代器到达那里,这显然是非常低效的。
  • @bones.felipe: unordered_set 根本不像你想的那样做。例如,在我系统上的 VS11 中,您的代码会打印“1 9 4 0 8”。在您自己的实现中添加更多数字,我几乎可以保证您不会继续看到类似堆栈的行为。

标签: c++ hash c++11 iterator set


【解决方案1】:

在 unordered_set 中,插入的顺序不一定与迭代集合时获得的顺序相对应(因此名称为“unordered”)。在此数据结构中不支持双向迭代器(使用 -- 运算符)的部分原因是,当您不知道你会从中得到的元素。

您创建的插入顺序并不决定您在迭代时将获得的顺序(首先插入“9”并不意味着 s.end() 将返回“9”)。这是因为决定该顺序的因素仅取决于该集合如何计算您插入的每个对象的哈希值,类似于哈希表 (http://en.wikipedia.org/wiki/Hash_table)。因此,您不能可靠地使用此集合来复制“堆栈”,因为这不是此特定数据结构的用途。

还有其他 C++ STL 数据结构可用于保持顺序,例如 http://www.cplusplus.com/reference/stack/

【讨论】:

    猜你喜欢
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 2020-12-08
    • 2010-11-30
    • 1970-01-01
    • 2012-04-02
    相关资源
    最近更新 更多