从零开始写STL—set/map
这一部分只要把搜索树中暴露的接口封装一下,做一些改动。
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的更多相关文章
- 从零开始写STL - 智能指针
从零开始写STL - 智能指针 智能指针的分类及其特点: scoped_ptr:初始化获得资源控制权,在作用域结束释放资源 shared_ptr: 引用计数来控制共享资源,最后一个资源的引用被释放的时 ...
- 从零开始写STL—栈和队列
从零开始写STL-栈和队列 适配器模式 意图:将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 主要解决:主要解决在软件系统中,常常要将 ...
- 从零开始写STL—容器—vector
从0开始写STL-容器-vector vector又称为动态数组,那么动态体现在哪里?vector和一般的数组又有什么区别?vector中各个函数的实现原理是怎样的,我们怎样使用会更高效? 以上内容我 ...
- 从零开始写STL—模板元编程之any
any class any; (since C++17) The class any describes a type-safe container for single values of any ...
- 从零开始写STL—functional
function C++11 将任意类型的可调用(Callable)对象与函数调用的特征封装到一起. 这里的类是对函数策略的封装,将函数的性质抽象成组件,便于和algorithm库配合使用 基本运算符 ...
- 从零开始写STL—哈希表
static const int _stl_num_primes = 28; template<typename T, typename Hash = xhash<T>> cl ...
- 从零开始写STL—模板元编程之tuple
tuple Class template std::tuple is a fixed-size collection of heterogeneous values. It is a generali ...
- C++ STL中Map的按Key排序和按Value排序
map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区 分),我们用map来进 ...
- 学习hash_map从而了解如何写stl里面的hash函数和equal或者compare函数
---恢复内容开始--- 看到同事用unordered_map了所以找个帖子学习学习 http://blog.sina.com.cn/s/blog_4c98b9600100audq.html (一)为 ...
随机推荐
- (译文)IOS block编程指南 3 概念总览
Conceptual Overview(概览) Block objects provide a way for you to create an ad hoc function body as an ...
- flask_第一个程序
安装flask sudo pip3 install flask falsk最小应用 from flask import Flask app = Flask(__name__) @app.route(' ...
- uva1412 Fund Management
状压dp 要再看看 例题9-17 /* // UVa1412 Fund Management // 本程序会超时,只是用来示范用编码/解码的方法编写复杂状态动态规划的方法 // Rujia Liu ...
- 目录下 shift 右键菜单 打开cmd 或者在 地址栏输入cmd 回车进入cmd
目录下 shift 右键菜单 打开cmd 或者在 地址栏输入cmd 回车进入cmd
- C ++ _基础之共用体
由以下代码来进一步学习共用体 #include <stdio.h> #include<iostream> void main() { union un { int a; cha ...
- python猜年龄游戏升级版
猜年龄游戏升级版 要求:允许用户最多尝试3次,每尝试3次后,如果还没猜对,就问用户是否还想继续玩,如果回答Y,就继续让其猜3次,以此往复,如果回答N,就退出程序,如何猜对了,就直接退出 age = 1 ...
- windows环境下Robot Framework的安装步骤
Robot Framework是由python编写的开源的用来做功能性测试的自动化测试框架.本文介绍Robot Framework在windows环境下的安装步骤. 安装python从python官网 ...
- 第三讲:post-processsing with vcs+ files
1,dump wave by system function $vcdpluson(level_number,module_instance,....|net_or_reg) $vcdplusoff ...
- Django框架基础知识02-路由及渲染
1.URL(Uniform Resoure Locator)统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址.互联网上的每个文件都有一个唯一的URL ...
- HTML中复选框的使用方法
<select id="question"> {# 常见问题.ajax用editor.html('1231254')填充#} <option value=&quo ...