C++ 为什么;无序的“映射::迭代器”;不提供;运算符--“是吗?”;?

C++ 为什么;无序的“映射::迭代器”;不提供;运算符--“是吗?”;?,c++,c++11,dictionary,iterator,unordered-map,C++,C++11,Dictionary,Iterator,Unordered Map,在传统地图中,我们可以创建如下代码: #包括 #包括 使用名称空间std; int main(){ 地图m; m[666]=222; m[777]=333; 自动it=--(m.end()); cout并具有不同的迭代器要求(重点): map 迭代器a双向迭代器到value\u类型 无序地图 迭代器a向前迭代器到value\u类型 顺便说一句,我认为--的这种用法不好。为什么不干脆auto it=m.end()-1;?无序映射是无序的,所以反转它可能没有意义。因为它是一个正向迭代器?是的,但是为

在传统地图中,我们可以创建如下代码:

#包括
#包括
使用名称空间std;
int main(){
地图m;
m[666]=222;
m[777]=333;
自动it=--(m.end());
cout并具有不同的迭代器要求(重点):

map

迭代器
a双向迭代器到
value\u类型

无序地图

迭代器
a向前迭代器到
value\u类型


顺便说一句,我认为
--
的这种用法不好。为什么不干脆
auto it=m.end()-1;
无序映射是无序的,所以反转它可能没有意义。因为它是一个正向迭代器?是的,但是为什么?(我知道为什么,但答案应该告诉OP)@MooingDuck如果你知道,为什么不写你自己的答案?@MooingDuck我回答了问题“定义的标准是否如此不同”。关于“为什么”,我不确定,但所说的内容(例如)听起来合乎逻辑。我想原因是允许以类似列表的方式实现bucket数据(使用索引或指针)。在某些情况下,这可能是有益的,例如,我们在多线程哈希表中使用这种实现,插入使用锁,但查找不需要(只需要一次原子读取)。
#include <iostream>
#include <map>
using namespace std;

int main() {
    map<int, int> m;
    m[666]=222;
    m[777]=333;
    auto it = --(m.end());
    cout << (*it).first;
    return 0;
}
#include <iostream>
#include <unordered_map>
using namespace std;

int main() {
    unordered_map<int, int> m;
    m[666]=222;
    m[777]=111;
    auto it = --(m.end());
    cout << (*it).first;
    return 0;
}

prog.cpp:9:12: error: no match for 'operator--' (operand type is 'std::unordered_map<int, int>::iterator {aka std::__detail::_Node_iterator<std::pair<const int, int>, false, false>}')
  auto it = --(m.end());
            ^