如何获取std :: unordered_map的最后一个元素?

时间:2014-08-06 16:48:23

标签: c++

如何获取std::unordered_map的最后一个元素?

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

4 个答案:

答案 0 :(得分:8)

容器中没有“最后一个元素”无序

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

修改

要检查你的迭代器是否会结束,只需增加它(并可能将其保存为临时)并对mymap.end()进行检查,或者更清楚:if (std::next(it) == last)

答案 1 :(得分:1)

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

std::unordered_map dico;
if(dico.count(key)!=0){
    //code here
}

答案 2 :(得分:1)

std::unordered_map::iterator last_elem;
for (std::unordered_map::iterator iter = myMap.begin(); iter != myMap.end(); iter++)
    last_elem = iter;
// use last_elem, which now points to the last element in the map

这将为您提供地图为您提供的任何顺序的最后一个元素。

修改:您需要使用std::unordered_map<YourKeyType, YourValueType>而非std::unordered_map。我只是这样写的,因为你没有在你的问题中提供类型。

或者,正如vsoftco(谢谢)所建议的那样,您可以将last_elemiter声明为decltype(myMap)::iterator

(如果您正在使用MSVC ++编译器进行编译,则需要添加typedef decltype(myMap) map_type;,然后使用decltype(myMap)::iterator而不是map_type::iterator。{/ p>

答案 3 :(得分:0)

在您的评论中,您的目标似乎是确定您在向前迭代时是否在最后一个元素上。这比找到最后一个元素要容易得多:

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;
}

以上内容适用于任何可迭代的Range(包括数组,std容器或自定义容器)。

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

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

否则,我们不是。

这对不支持多次传递的迭代器不起作用。