您要求一个由您的所有元素组成的范围,unordered_map
其键为'a'
. 您的无序地图不包含此类元素。所以,范围是空的。
情况也是map
如此。但是,表示此条件的方式因容器而异(尽管并非如此;继续阅读)。容器std::map
和std::unordered_map
不是同一个东西(因此它们有不同的名称)。前者是有序的,而后者不是,因此出于逻辑实现原因,它的工作方式略有不同:
unordered_map
返回值
std::pair
包含一对定义所需范围的迭代器。如果没有这样的元素,则过去的(请参阅end()
)迭代器作为该对的两个元素返回。
map
返回值
std::pair
包含一对定义所需范围的迭代器:第一个指向不小于的第一个元素,key
第二个指向大于的第一个元素key
。如果没有不小于 key 的元素,则将过去的(请参阅end()
)迭代器作为第一个元素返回。同样,如果没有大于 的元素key
,则返回结束迭代器作为第二个元素。)
这种差异无关紧要。在任何一种情况下,您都应该像使用任何迭代器范围一样简单地迭代( first
, second
]来检查范围内的元素(如果存在)。
在您的代码中,您没有检查案例中返回的对的两个部分。map
如果你这样做了,那么你会发现first == second
(同样,表示一个空范围)。
您的map
代码有效地取消引用返回范围的“过去的”迭代器。
#include <iostream>
#include <map>
#include <unordered_map>
using namespace std;
int main ()
{
{
std::map<char,int> mymap;
mymap['c'] = 60;
std::map<char, int>::iterator itlo = mymap.equal_range('a').first;
std::map<char, int>::iterator itup = mymap.equal_range('a').second;
// This compares each range extent to the map's end, which is not really useful
cout << "map::itup " << (itup == mymap.end() ? "END" : "NOT END") << '\n';
cout << "map::itlo " << (itlo == mymap.end() ? "END" : "NOT END") << '\n';
// This examines the range itself
cout << "map range empty: " << (itlo == itup ? "YES" : "NO") << '\n';
cout << "map range size: " << std::distance(itlo, itup) << '\n';
}
{
std::unordered_map<char, int> mymap;
mymap['c'] = 60;
mymap['d'] = 70;
std::unordered_map<char, int>::iterator itlo = mymap.equal_range('a').first;
std::unordered_map<char, int>::iterator itup = mymap.equal_range('a').second;
// This compares each range extent to the map's end, which is not really useful
cout << "unordered_map::itup " << (itup == mymap.end() ? "END" : "NOT END") << std::endl;
cout << "unordered_map::itlo " << (itlo == mymap.end() ? "END" : "NOT END") << std::endl;
// This examines the range itself
cout << "unordered_map range empty: " << (itlo == itup ? "YES" : "NO") << '\n';
cout << "unordered_map range size: " << std::distance(itlo, itup) << '\n';
}
}
// Output:
//
// map::itup NOT END
// map::itlo NOT END
// map range empty: YES
// map range size: 0
// unordered_map::itup END
// unordered_map::itlo END
// unordered_map range empty: YES
// unordered_map range size: 0