首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么异类性病::*地图查找选择在C++?

为什么异类性病::*地图查找选择在C++?
EN

Stack Overflow用户
提问于 2022-06-02 09:22:30
回答 2查看 148关注 0票数 5

要支持std::map的异构密钥查找,就必须要比以前的详细一些:(取自去做这件事)

代码语言:javascript
复制
int main()
{
    {
        puts("The C++11 way makes a copy...");
        std::map<std_string, int> m;
        auto it = m.find("Olaf");
    }
    {
        puts("The C++14 way doesn't...");
        std::map<std_string, int, std::less<>> m;
        auto it = m.find("Olaf");
    }
}

请参见:https://www.cppstories.com/2021/heterogeneous-access-cpp20/以获得解释。

从这个链接和链接问题(也来自N3657)中,给出了一些零散的理由来解释为什么这是被选择的。由于我不得不做相当多的滚动,而且我没有找到一个简单的原因摘要,所以我想在这里整理一个每个初级开发人员都理解的摘要。

为什么愚蠢的C++让我多写std::less<>?!为什么它不允许与我们经常使用的默认类型进行透明的异构比较?

;-)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-02 11:37:57

如果std::map将简单地默默地支持这一点,也就是说,如果std::map<KeyT, ValT>支持find(LookupT)的“任何兼容”类型,那么:

隐式支持异构查找可能很危险,因为转换后可能无法维护值之间的关系。例如,1.0 < 1.1,但是static_cast<int>(1.0) == static_cast<int>(1.1)。因此,使用doublestd::set<int>中查找值可能导致不正确的结果。

  • Performance(!) -不支持异构比较的类型的旧代码将开始运行得更慢:dyp写

考虑到某些类型的stupid_string只存在来自char const*的转换构造函数,而不存在比较运算符operator<(stupid_string const&, char const*),只有operator<(stupid_string const&, stupid_string const&)。由于std::less<> (( will ))转发给比较操作符,每个比较都将创建一个新的stupid_string。

(而不是仅仅在std::find的调用站点上创建额外的比较对象)

票数 0
EN

Stack Overflow用户

发布于 2022-06-02 10:55:09

地图模板具有默认比较。

代码语言:javascript
复制
template<
    class Key,
    class T,
    class Compare = std::less<Key>,
    class Allocator = std::allocator<std::pair<const Key, T> >
> class map;

假设您想要一个map<my_type, int>,并通过专门化的std::less<my_type> (然后在默认情况下使用)启用它。

那么C++14就不能仅仅开始使用非专门化的std::less<>。所以你必须明确要求!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72473815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档