从零开始写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 (一)为 ...
随机推荐
- 从零开始部署小型企业级虚拟桌面 -- Vmware Horizon View 6 For Linux VDI
环境说明 注,本套环境所用机器全部是64位的. 管理服务器载体:安装win7操作系统,通过VMware Workstation安装4台虚拟机,用作vCenter,Connection Server,D ...
- 关于Ubuntu上的服务文件
问题发现 今天在给ubuntu系统安装ftp服务时,一件奇怪的事引起了我的注意.当我服务安装完成后,想要测试一下是否能控制服务,便输入如下命令: service vsftpd restart 它返回的 ...
- flask_SQLAlchemy 中常用的过滤和执行器
常用的SQLAlchemy查询过滤器 过滤器 说明 filter() 把过滤器添加到原查询上,返回一个新查询 filter_by() 把等值过滤器添加到原查询上,返回一个新查询 limit 使用指定的 ...
- iptables 防火墙
运行源地址为192.168.10.10-192.168.10.50 这个网段的机器访问本机的20-25还有80.443.6379端口进来的流量 iptables -A INPUT -p tcp -m ...
- && (and)、||(or) 条件语句
当前面条件满足时,就执行后面的代码 //条件为真时,就执行其中的语句 if($a>0){ $b='This is test'; } //上面的写法太麻烦,可以这样简写 $a>0 & ...
- 把txt格式数据制作成xml数据
txt格式数据: 代码: s1=""" <object> <name>{0}</name> <pose>Unspecifi ...
- JSP页面通过c:forEach标签循环遍历List集合
c:forEach>标签有如下属性: 属性 描述 是否必要 默认值items 要被循环的信息 否 无begin 开始的元素(0=第一个元素,1=第二个元素) 否 0end 最后一个元素(0=第一 ...
- ZOJ3228 Searching the String (AC自动机)
Searching the String Time Limit: 7 Seconds Memory Limit: 129872 ...
- Shell函数和正则表达式
1. shell函数 shell中允许将一组命令集合或语句形成一段可用代码,这些代码块称为shell函数.给这段代码起个名字称为函数名,后续可以直接调用该段代码. 格式: func() { #指定 ...
- memcached 经典问题或现象
缓存雪崩现象及真实案例 缓存雪崩一般是由某个缓存节点失效,导致其他节点的缓存命中率下降, 缓存中缺失的数据 去数据库查询.短时间内,造成数据库服务器崩溃. 重启 DB,短期又被压跨,但缓存数据也多一些 ...