C++ 如何获取std::无序_映射的最后一个元素?

C++ 如何获取std::无序_映射的最后一个元素?,c++,C++,如何获取std::无序映射的最后一个元素 myMap.rbegin()和--myMap.end()是不可能的。容器中没有未排序的“最后一个元素” 您可能需要一个有序的容器,例如std::map,并使用mymap.rbegin()->first访问最后一个元素(另请参见) 编辑: 要检查迭代器是否将到达末尾,只需增加它(并可能将其保存在临时文件中),然后对照mymap.end(),或者更干净的检查:if(std::next(it)=last)您不能。根据定义,元素不是基于某种顺序存储的。密钥首先被

如何获取
std::无序映射的最后一个元素

myMap.rbegin()
--myMap.end()
是不可能的。

容器中没有未排序的“最后一个元素”

您可能需要一个有序的容器,例如
std::map
,并使用
mymap.rbegin()->first
访问最后一个元素(另请参见)

编辑:


要检查迭代器是否将到达末尾,只需增加它(并可能将其保存在临时文件中),然后对照
mymap.end()
,或者更干净的检查:
if(std::next(it)=last)

您不能。根据定义,元素不是基于某种顺序存储的。密钥首先被散列,这就是为什么O(1)搜索是可能的。如果要检查无序映射中是否存在密钥,可以使用以下代码:

std::unordered_map dico;
if(dico.count(key)!=0){
    //code here
}
这将按照地图给您的顺序为您提供最后一个元素

编辑:您需要使用
std::unordered\u映射
而不仅仅是
std::unordered\u映射
。我这样写是因为你没有在问题中提供类型

或者,根据
vsoftco
(谢谢)的建议,您可以将
last_elem
iter
声明为
decltype(myMap)::iterator


(如果您使用MSVC++编译器进行编译,则需要在注释中添加
typedef decltype(myMap)map\u type;
,然后代替
decltype(myMap)::iterator
使用
map\u type::iterator

在向前迭代时,您的目标似乎是确定您是否在最后一个元素上。这是一个比查找最后一个元素更容易解决的问题:

template<class Range, class Iterator>
bool is_last_element_of( Range const& r, Iterator&& it ) {
  using std::end;
  if (it == end(r)) return false;
  if (std::next(std::forward<Iterator>(it)) == end(r)) return true;
  return false;
}
模板
bool是(Range const&r、Iterator&it)的最后一个元素{
使用std::end;
如果(it==end(r))返回false;
如果(std::next(std::forward(it))==end(r))返回true;
返回false;
}
上述内容应适用于任何iterable范围(包括数组、
std
容器或自定义容器)

我们检查是否是
end
(在这种情况下,我们不是最后一个元素,前进是非法的)

如果我们不是
end
,我们就会看到我们的
std::next
是否是
end
。如果是这样,我们就是最后一个要素

否则,我们就不是


这在不支持多个过程的迭代器上不起作用。

无序和最后一个的概念似乎有冲突。好吧,当你迭代时,检查是否完成(当然是在点击end()之前)。然后检查执行
++
是否为你提供了
end()
…谢谢。我需要一个无序的_图,但我需要在点击end()之前检查我何时完成。。。我可以保存“以前迭代过的元素”。。。只是搜索一些“干净的解决方案”。那么为什么不像往常一样检查迭代器的
end()
?并保留以前迭代过的项?这就是我所做的。我只是想知道是否会有“清洁剂”存在。请注意,在Windows上,rbegin是否存在^^^^我对此表示怀疑,标准明确表示,它不存在于无序容器上。。。请看我的编辑,在您的情况下,最简单的方法就是您所做的:increment和compare to end()@yerzhan7“first”将为您获取最后一个键,“second”将为您获取最后一个值,选择适合您的情况的编译器您使用的是什么?MSVC++?我相信这不会用叮当声编译。你在
unordered\u-map
的哪里看到了
rbegin
?unordered\u-map没有反向迭代器。我想知道为什么
std::prev(myMap.end())
不起作用,并且会出现错误。很抱歉,大家都错了。我的意思是
begin
,而不是
rbegin
。仍然不正确,但接近:),您需要
decltype(myMap)::迭代器最后一个元素
decltype(myMap):
for
循环中的迭代器iter
template<class Range, class Iterator>
bool is_last_element_of( Range const& r, Iterator&& it ) {
  using std::end;
  if (it == end(r)) return false;
  if (std::next(std::forward<Iterator>(it)) == end(r)) return true;
  return false;
}