关联容器中“相等”与“等价”的区别及注意事项

STL对于set/map这类关联容器,涉及到插入和查找操作。由于set/map是有序的,插入(insert)操作就需要根据key的大小进行排序,实现中使用了operator < 用于比较key大小; 其成员函数find操作也是基于operator <来找到给定的元素。我们称之为“等价”。

而<alogrithm> 中的find函数则不然:因为find算法针对的是普通的前向迭代器,并不要求元素有序,其基于operator == 来判断元素是否相等。我们称之为"相等"

set容器的insert和find源码分析

  • 插入(insert)操作的逻辑
    根据需要插入元素的key,在关联容器中找到插入位置(基于operator操作比较元素大小)
    借助clion IDE的跳转功能,我们来看下函数调用栈
// set插入元素示例
std::set<std::string> test_set;
test_set.insert("hello");

以下为std::set insert内部实现

pair<iterator,bool> insert(const value_type& __v)
{return __tree_.__insert_unique(__v);}
pair<iterator, bool> __insert_unique(const __container_value_type& __v) {
    return __emplace_unique_key_args(_NodeTypes::__get_key(__v), __v);
}
#ifndef _
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值