为什么 unordered_map::equal_range upper_bound 如果键小于第一个映射元素,则返回
Why unordered_map::equal_range upper_bound returns end if a key is less than first map element
我注意到如果传递的键小于 map 的第一个键,unordered_map::equal_range upper_bound(第一个)返回 end
#include <iostream>
#include <map>
#include <tr1/unordered_map>
using namespace std;
int main ()
{
{
std::map<char,int> mymap;
mymap['c'] = 60;
std::map<char,int>::iterator itup = mymap.equal_range('a').first;
std::cout << "map::itup " << itup->first << std::endl;
}
{
tr1::unordered_map<char, int> mymap;
mymap['c'] = 60;
mymap['d'] = 70;
tr1::unordered_map<char, int>::iterator itlo = mymap.equal_range('a').first;
tr1::unordered_map<char, int>::iterator itup = mymap.equal_range('a').second;
cout << "unordered_map::itup " << (itup == mymap.end() ? "END" : "NOT END") << std::endl;
cout << "unordered_map::itlo " << (itlo == mymap.end() ? "END" : "NOT END") << std::endl;
}
return 0;
}
输出为:
map::itup c
unordered_map::itup END
unordered_map::itlo END
请注意,地图和unordered_map的行为是不同的 - 任何原因还是unordered_map的问题?
发生这种情况是因为unordered_map
是无序的,这并不奇怪。
参见§22.2.7 [unord.req],表70,关于equal_range
的要求:
返回:包含键等效于
k
的所有元素的范围。 如果不存在此类元素,则返回make_pair(b.end(), b.end())
。
这与有序关联容器(如std::map
)的要求不同,其中equal_range
是根据lower_bound
和upper_bound
定义的。
std::unordered_map
没有lower_bound
和upper_bound
,原因很明显。
您请求了一个包含unordered_map
中键为'a'
的所有元素的范围。您的无序地图不包含此类元素。因此,范围为空。
map
案也是如此。但是,表示此条件的方式因容器而异(尽管不是真的;请继续阅读)。容器std::map
和std::unordered_map
不是一回事(因此它们有不同的名称)。前者是有序的,而后者不是,因此出于逻辑实现原因,它的工作方式略有不同:
unordered_map
返回值
std::pair
包含一对定义所需范围的迭代器。如果没有这样的元素,则返回结束(见end()
)迭代器作为对的两个元素。
map
返回值
std::pair
包含一对定义所需范围的迭代器:第一个指向不小于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
(现场演示)
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- 如何仅读取文本文件中的第一个值
- 在C++中,如何在第一个"system()"结束后执行第二个"system()"?
- 查找不在标准中的第一个值::设置<int>最小-最大值
- C++:忽略第一个 cin.ignore 之后的输入
- 在C++中打印多个矢量的第一个值
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- C++第一个cout将不会打印
- 我们可以在第一个else-if条件结束后使用另一个else-if条件吗
- 将一个向量对放在一个无序映射与一个映射中
- OpenGL:第二个VBO破坏了第一个VBO
- 为什么第一个Dynamic_cast没有投射到基类?
- OpenGL 2D游戏只绘制第二个精灵纹理而不是第一个
- C++ 为什么程序只读取第一个值
- 在我的第一个C++程序中需要一些帮助(简单)
- 为什么我的代码在第一个 if 语句处中断?
- 是否可以从另一个类对象调用一个类函数而不继承第一个类
- 如何将std ::映射的第一个N元素复制到另一个地图
- 使用 STL 映射/集合/多重集/多重映射,如何查找大于或等于搜索键的第一个值