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 _