如何获取std::unordered_map
的最后一个元素?
myMap.rbegin()
和--myMap.end()
是不可能的。
答案 0 :(得分:8)
容器中没有“最后一个元素”无序。
您可能需要一个有序的容器,例如std::map
并使用mymap.rbegin()->first
访问最后一个元素(另请参阅this post)
修改强>
要检查你的迭代器是否会结束,只需增加它(并可能将其保存为临时)并对mymap.end()
进行检查,或者更清楚:if (std::next(it) == last)
答案 1 :(得分:1)
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_elem
和iter
声明为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
。如果是这样,我们就是最后一个元素。
否则,我们不是。
这对不支持多次传递的迭代器不起作用。