我需要从unordered_set中获取最后一个元素,它必须使用unordered_set,而不是任何其他类。 (主要是因为我要修改已经完成的许多代码)但是通过我一直在寻找的唯一可能的方法是迭代它并保存元素然后返回它。但是在大集合中它会太慢。除了我试过这个并且没有用。
unordered_set <int>::iterator it = frames.end();
--it;
我收到以下错误: “在' - ''中没有'运营商 - '匹配”
它主要是因为它有用,它以“堆栈”的方式存储数据,如下所示:
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”
所以“last”元素总是9,它是插入的“第一个”元素,正如我之前以“堆栈”方式所说的那样。
有任何改进的想法吗?
答案 0 :(得分:2)
在unordered_set中,插入的顺序不一定对应于迭代集合时将获得的顺序(因此名称为“无序”)。在这个数据结构中不支持双向迭代器(使用 - 运算符)的部分原因是因为能够在unordered_set上向后/向前移动没有区别,当你不知道它的顺序是什么时你将从中获得的元素。
您创建的插入顺序并不表示迭代时的顺序(首先插入“9”并不意味着s.end()会返回“9”)。这是因为指示该顺序仅取决于该集合如何计算您插入的每个对象的哈希值,类似于哈希表(http://en.wikipedia.org/wiki/Hash_table)。因此,您无法可靠地使用此集合来复制“堆栈”,因为这不是此特定数据结构的用途。
您可以使用其他C ++ STL数据结构来保留http://www.cplusplus.com/reference/stack/等顺序。