STL源码阅读——set 源码阅读

前言

最近刷题有用到set, 于是突然来了兴致,就想了解 STL 中set 的实现。说起set,立刻就能想到的有几点,set 底层用红黑树实现,set 是天然有序的,set 可以去重(不包含重复元素,当然 multiset 可以)。然而还是想对 set 的实现做个了解,比如到底是怎么插入删除的?侯捷大佬的 《STL源码剖析》很不错,菜鸡本鸡没有好好看。带着侯捷大佬的名言“源码面前无秘密”,看了一下 set 的源码,做个简单记录。主要关注 set 的插入删除数据,至于红黑树的实现,就不深究了。不同C++版本的实现的也不尽相同,不做一概而论。

源码位置:阅读源码首先需要知道源码位置在哪儿。stl源码一般存放在 include/.../bits/ 文件夹下。

Windows:用编译器直接就可以打开头文件的具体源码,不多说。

Linux:linux底下一般头文件都是存放在 /usr/include 底下,C++源码在 C++文件夹下,找到里面的bits文件夹。比如我的就是/usr/include/c++/5/bits。bits外面是C++的头文件,一般都是只做头文件包含,具体STL实现在bits文件夹下。

/** @file include/set
 *  This is a Standard C++ Library header.
 */

#ifndef _GLIBCXX_SET
#define _GLIBCXX_SET 1

#pragma GCC system_header

#include <bits/stl_tree.h>    // 红黑树实现
#include <bits/stl_set.h>    // 主要 set 类定义已经方法实现,以下源码实现都是此文件中
#include <bits/stl_multiset.h>    //multiset 
#include <bits/range_access.h>

#ifdef _GLIBCXX_DEBUG
# include <debug/set>
#endif

#ifdef _GLIBCXX_PROFILE
# include <profile/set>
#endif

#endif /* _GLIBCXX_SET */

set基本定义

template<typename _Key, typename _Compare = std::less<_Key>,
	   typename _Alloc = std::allocator<_Key> >
    // 三个模板参数,第一个就是数据类型;第二个比较函数,仿函数,默认是less;
    // 第三个是分配器, 默认 std::allocator
    class set
    {
      // concept requirements
      typedef typename _Alloc::value_type                   _Alloc_value_type;
      __glibcxx_class_requires(_Key, _SGIAssignableConcept)
      __glibcxx_class_requires4(_Compare, bool, _Key, _Key,
				_BinaryFunctionConcept)
      __glibcxx_class_requires2(_Key, _Alloc_value_type, _SameTypeConcept)

    public:
      // typedefs:
      //@{
      /// Public typedefs.        typedef 定义一些别名,后面源码中以别名代替
      typedef _Key     key_type;
      typedef _Key     value_type;
      typedef _Compare key_compare;
      typedef _Compare value_compare;
      typedef _Alloc   allocator_type;

    private:
      typedef typename _Alloc::template rebind<_Key>::other _Key_alloc_type;

      typedef _Rb_tree<key_type, value_type, _Identity<value_type>,
		       key_compare, _Key_alloc_type> _Rep_type;
      _Rep_type _M_t;  // Red-black tree representing set.    // 红黑树别名

代码过多,只展示部分。一个容器的使用,首先要看容器的定义,然后是容器的使用方法。可知 set 有三个模板参数,第一个数据类型,第二个比较函数,第三个是分配器。比较函数都是放在 stl_function.h 文件中,less,greater 等等都是实现的仿函数,set 默认是 less。一般分配器就用std::allocator,就不自己再指定了,当然分配器也有其他实现,侯捷大佬有讲。

 /// One of the @link comparison_functors comparison functors@endlink.
  template<typename _Tp>    // less 函数为例
    struct less : public binary_function<_Tp, _Tp, bool>
    {
      bool
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
对于C++ STL源码分析,这是一个广泛而复杂的话题。C++ STLC++标准库中的一部分,包含了许多不同的容器、算法和迭代器等组件,用于提供通用的数据结构和算法支持。 在进行源码分析之前,你需要具备一定的C++编程知识和理解C++模板的工作原理。然后,你可以通过查看STL源码实现来深入了解其内部机制。 在C++ 11中,STL引入了一些新的特性和容器。例如,引用中提到的range-based for循环语句,可以更方便地遍历容器中的元素。此外,C++ 11还对容器进行了分类,包括序列容器、关联容器和无序容器等。 引用提到了STL的六个主要部分,包括容器、算法、迭代器、函数对象、适配器和分配器。这些部分提供了不同的功能和特性,可以满足各种编程需求。 在C++ 11中,一些容器名称发生了变化,如slist被重命名为forward_list,hash_set和hash_map被重命名为unordered_set和unordered_map。这些变化是为了更好地反映容器的功能和语义。 要深入了解STL源码,你可以参考一些重要的资源网站,如cplusplus.com、cppreference.com和gcc.gnu.org。这些网站提供了详细的文档和例子,以帮助你理解STL的实现细节。 总之,要进行C++ STL源码分析,你需要具备一定的编程和模板知识,并参考相关的文档和资源。通过深入研究STL源码实现,你将能够更好地理解其内部机制和使用方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值