这一部分只要把搜索树中暴露的接口封装一下,做一些改动。

set源码剖析

	template<typename T>
class set
{
public:
typedef T key_type;
typedef BStree_iterator<T> iterator;
private:
BStree<T> sequence;
public:
set() :sequence() {}
iterator begin()
{
return sequence.begin();
}
iterator end()
{
return sequence.end();
}
void erase(iterator pos)
{
if (pos.p.node == NULL)
return;
sequence.erase(pos);
}
iterator find(const key_type& key)
{
return sequence.find(key);
}
size_t count(const key_type& x)
{
iterator pos = sequence.find(x);
if (pos.p.node == NULL)
return 0;
else
return 1;
}
size_t erase(const key_type& x)
{
iterator pos = sequence.find(x);
if (pos.p.node == NULL)
return 0;
else
{
erase(pos);
return 1;
}
} bool empty()
{
return sequence.empty();
}
size_t size()
{
return sequence.size();
}
iterator insert(const T& val)
{
iterator f = sequence.find(val);
if (f == NULL)
return sequence.insert(val);
else
return f;
}
iterator lower_bound(const key_type& x)
{
return sequence.lower_bound(x);
}
iterator upper_bound(const key_type& x)
{
return sequence.upper_bound(x);
}
};

map

二叉搜索树中存储的元素—map_pair

template<typename K, typename T>
struct map_pair
{
typedef map_pair<K, T> self;
K first;
T second;
operator pair<K, T>()
{
return ministl::make_pair<K, T>(first, second);
}
map_pair(const pair<K, T>& rhs)
{
first = rhs.first;
second = rhs.second;
}
map_pair(const K& key, const T& val)
{
first = key, second = val;
}
bool operator==(const self& rhs) const
{
return first == rhs.first;
}
bool operator!=(const self& rhs) const
{
return !(*this == rhs);
}
bool operator<(const self& rhs) const
{
return first < rhs.first;
}
bool operator>(const self& rhs) const
{
return first > rhs.first;
}
bool operator>=(const self& rhs) const
{
return !(first < rhs.first);
}
bool operator<=(const self& rhs) const
{
return !(first > rhs.first);
}
};

map源码

	template<typename K, typename T>
class map
{
private:
typedef map_pair<K, T> key_value;
typedef size_t size_type;
BStree<key_value> sequence;
public:
typedef BStree_iterator<key_value> iterator;
map() :sequence() {}
iterator begin()
{
return sequence.begin();
}
iterator end()
{
return sequence.end();
}
bool empty()
{
return sequence.empty();
}
size_type size()
{
return sequence.size();
}
iterator find(const K& x)
{
return sequence.find(map_pair<K, T>(x, T()));
}
size_type count(const K& x)
{
if (sequence.find(map_pair<K, T>(x, T())).p.node == NULL)
return 0;
else
return 1;
}
auto insert(const key_value& key)
{
return sequence.insert(map_pair<K,T>(key,T()));
}
template <class InputIterator>
void insert(InputIterator first, InputIterator last)
{
for (auto it = first; it != last; it++)
insert(*first);
}
void erase(const K& key)
{
return sequence.erase(map_pair<K, T>(key, T()));
}
iterator upper_bound(const K& key)
{
return sequence.upper_bound(map_pair<K, T>(key, T()));
}
iterator lower_bound(const K& key)
{
return sequence.lower_bound(map_pair<K, T>(key, T()));
} T& operator [](const K& x)
{
pair<iterator,bool> res = sequence.insert(map_pair<K,T>(x,T()));
return (*res.first).second;
} };

从零开始写STL—set/map的更多相关文章

  1. 从零开始写STL - 智能指针

    从零开始写STL - 智能指针 智能指针的分类及其特点: scoped_ptr:初始化获得资源控制权,在作用域结束释放资源 shared_ptr: 引用计数来控制共享资源,最后一个资源的引用被释放的时 ...

  2. 从零开始写STL—栈和队列

    从零开始写STL-栈和队列 适配器模式 意图:将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 主要解决:主要解决在软件系统中,常常要将 ...

  3. 从零开始写STL—容器—vector

    从0开始写STL-容器-vector vector又称为动态数组,那么动态体现在哪里?vector和一般的数组又有什么区别?vector中各个函数的实现原理是怎样的,我们怎样使用会更高效? 以上内容我 ...

  4. 从零开始写STL—模板元编程之any

    any class any; (since C++17) The class any describes a type-safe container for single values of any ...

  5. 从零开始写STL—functional

    function C++11 将任意类型的可调用(Callable)对象与函数调用的特征封装到一起. 这里的类是对函数策略的封装,将函数的性质抽象成组件,便于和algorithm库配合使用 基本运算符 ...

  6. 从零开始写STL—哈希表

    static const int _stl_num_primes = 28; template<typename T, typename Hash = xhash<T>> cl ...

  7. 从零开始写STL—模板元编程之tuple

    tuple Class template std::tuple is a fixed-size collection of heterogeneous values. It is a generali ...

  8. C++ STL中Map的按Key排序和按Value排序

    map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区 分),我们用map来进 ...

  9. 学习hash_map从而了解如何写stl里面的hash函数和equal或者compare函数

    ---恢复内容开始--- 看到同事用unordered_map了所以找个帖子学习学习 http://blog.sina.com.cn/s/blog_4c98b9600100audq.html (一)为 ...

随机推荐

  1. centos设置系统时间

    系统日期设定成1996年6月10日上午9点date -s 06/22/96date -s 09:00:00

  2. Halcon学习笔记2

    图像预处理 一般来说,我们采集到的图像会有一些小黑点,小斑点,不平滑等因素会会影响我们后期的算法,此时就需要我们对其图片进行预处理. 下面是一些预处理基本算子: 1.消除噪声:mean_image/b ...

  3. (转)让Spring自动扫描和管理Bean

    http://blog.csdn.net/yerenyuan_pku/article/details/52861403 前面的例子我们都是使用XML的bean定义来配置组件.在一个稍大的项目中,通常会 ...

  4. liunx 常用的命令

    常用命令 ======================输入模式=================== Ctrl+d 向前缩进 Ctrl+t 向后缩进 =====================光标模式 ...

  5. input_shape { dim: 1 dim: 3 dim: 224 dim: 224 }

    http://blog.csdn.net/u010417185/article/details/52619593

  6. Linux环境下挂载SD卡的教程

    1.插入SD卡 如果系统能够识别SD卡,则会打印一些信息: 2.查看系统给SD卡分配的设备名 命令如下: fdisk -l 命令 说明:通常是根据SD卡的存储容量来确定的. 比如下面的信息: 3.挂载 ...

  7. SDOI2011 拦截导弹

    题目描述 题解: 对于第一问,我们求二维LIS即可; 对于第二问,我们可以记录向前最长长度,向前最长方案数,向后最长长度,向后最长方案数. 其实改改树状数组即可. 还有,方案数一定要开double. ...

  8. OpenJudge-百练-2755

    这道题用递归写的话还是很好写的,我们设递归函数的名称为Ways(w,k) . 它的含义就是,w的大小,取k个物品,有多少种方式. 我们可以知道递归的边界条件就是当w的大小为0的时候,我们的方法数只有一 ...

  9. [HIHO] 1048 铺地板

    历经千辛万苦,小Hi和小Ho终于到达了举办美食节的城市!虽然人山人海,但小Hi和小Ho仍然抑制不住兴奋之情,他们放下行李便投入到了美食节的活动当中.美食节的各个摊位上各自有着非常多的有意思的小游戏,其 ...

  10. webpack 之 plugin

    loader和plugins的区别是:前者处理单个文件,而后者作用于整个打包过程 内置插件:BannerPlugin 可以在打包后的文件上方添加备注信息,如版权说明等 // webpack.confi ...