加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – std :: map要求的键(设计决策)

发布时间:2020-12-16 05:58:25 所属栏目:百科 来源:网络整理
导读:当我做一个std :: map my_data_type,mapped_value时,我期望的是my_data_type有自己的运算符 lt. struct my_data_type{ my_data_type(int i) : my_i(i) { } bool operator(const my_data_type other) const { return my_i other.my_i; } int my_i;}; 原因是您
当我做一个std :: map< my_data_type,mapped_value>时,我期望的是my_data_type有自己的运算符< lt.
struct my_data_type
{
    my_data_type(int i) : my_i(i) { }

    bool operator<(const my_data_type& other) const { return my_i < other.my_i; }

    int my_i;
};

原因是您可以导出运算符>和operator ==来自operator< b < a意味着> b,所以有运算符>. !(a< b)&& !(b

operator== is inevitable for std::map::find()

这是你错误的地方.地图不使用operator ==,根本不是“不可避免的”.对于地图的目的,两个密钥x和y被认为是等效的,如果!(x< y)&& (y ,默认情况下使用operator<但是,如果您为KeyType专门使用std :: less,那么您不需要定义运算符<,并且如果为地图指定了不同的比较器,则它可能与操作符<或std :: less< KeyType&gt ;.所以我说过x以上,真的是cmp(x,y),其中cmp是严格的弱序. 这种灵活性是为什么不将operator ==拖到它中的另一个原因.假设KeyType是std :: string,并指定您自己的比较器,它可以实现特定于区域设置的不区分大小写的排序规则.如果map使用operator ==在某些时候,那么完全忽略这样一个事实,即只有通过大小写不同的字符串才能算作相同的键(或者在某些语言中):其他差异被认为对排序规则没有影响.因此,平等比较也必须是可配置的,但程序员只能提供一个“正确的”答案.这不是一个好的情况,你永远不希望你的API提供一些看起来像一个定制点的东西,但实际上并不是这样. 此外,这个概念是,一旦你排除了比您要搜索的关键字小的树部分,以及键的小于该部分的树,那么剩下的就是空(否匹配找到)或者其中有一个键(匹配找到).所以,你已经使用当前的<键然后键<目前,没有别的选择,只有等价.情况正是:

if (search_key < current_element)
    go_left();
else if (current_element < search_key)
    go_right();
else
    declare_equivalent();

你建议的是:

if (search_key < current_element)
    go_left();
else if (current_element < search_key)
    go_right();
else if (current_element == search_key)
    declare_equivalent();

这显然是不需要的.事实上,这是你的建议效率低下!

相关文章

  • c++ 什么要求必须std :: map键类满足是有效的键?
  • c++ 在std :: map中复制/移动键/值类型的要求?
  • c# - 什么要求是设计来解决的元组?
  • c - 如何对std :: map中的所有值求和?
  • c++ 使用std :: string作为std :: map的键
  • 在c中检索std :: map的随机键元素
  • c++ 对std :: map的类型要求
  • C - std :: wstring to std :: string - 快速和脏转换,用作std :: map中的键
点击查看更多相关文章

转载注明原文:c – std :: map要求的键(设计决策) - 代码日志

解决方法

operator== is inevitable for std::map::find()

这是你错误的地方.地图不使用operator ==,如果!(x< y)&& (y (编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读