stl源码剖析 详细学习笔记 set map
//
// set map.cpp
// 笔记
//
// Created by fam on 15/3/23.
//
//
//---------------------------15/03/23----------------------------
//set
{
/*
set概述:
1:所有的元素都会被自动排序,
2:所有的元素只有"键"没有“值”
或者说他们的“值”就是“键”
3:不允许出现两个相同的键值
4:不能通过迭代器改变set的值,因为set的值就是键,
如果可以改变,我们要先删除键,平衡二叉树,再加改变后的键,再平衡
这么做严重破坏了set的组织,iterator也会变得无效,到底是指向之前的位置
还是指向改变后的位置等等。所以stl中不允许改变set的值。
5:set用RB_tree作为底层机制(废话,不然干嘛花大篇幅介绍RB_tree)
*/
//class
template<class Key,
class Compare = less<Key>,
class Alloc = alloc>
class set
{
public:
typedef Key key_type;
typedef Key value_type;
typedef Compare key_compare;
typedef Compare value_compare;
private:
//identity<value_type>
可以根据key值得到value值
typedef rb_tree<key_type, value_type,
identity<value_type>, key_compare, Alloc> rep_type;
rep_type t;
public:
//由于上面说的set不能改变值,所以指针和迭代器引用这些
全都用RB_tree中的const类型的来指定
typedef typename rep_type::const_pointer pointer;
typedef typename rep_type::const_pointer const_pointer;
typedef typename rep_type::const_reference reference;
typedef typename rep_type::const_reference const_reference;
typedef typename rep_type::const_iterator iterator;
typedef typename rep_type::const_iterator const_iterator;
typedef typename rep_type::const_reverse_iterator reverse_iterator;
typedef typename rep_type::const_reverse_iterator const_reverse_iterator;
typedef typename rep_type::size_type size_type;
typedef typename rep_type::difference_type difference_type;
set() : t(Compare()){}
explicit set(const Compare& comp) : t(comp){}
//inset_unique
是不允许相同值出现的插入
template<class InputIterator>
set(InputIterator first, InputIterator last)
: t(Compare()){ t.insert_unique(first, last);}
template<class InputIterator>
set(InputIterator first, InputIterator last,const Compare& comp)
: t(comp){t.insert_unique(first, last);}
set(const set<Key, Compare, Alloc>& x): t(x.t){}
set<Key, Compare, Alloc>&
operator=(const set<Key, Compare, Alloc>& x)
{
t = x.t;
return *this;
}
key_compare key_comp()
const { return t.key_comp();}
//set中的值就是键
所以调用key_comp()
value_compare value_comp()
const {return t.key_comp();}
iterator begin()
const {return t.begin();}
iterator end()
const {return t.end();}
reverse_iterator rbegin()
const {return t.rbegin();}
reverse_iterator rend()
const {return t.end();}
bool empty()
const { return t.empty();}
size_type size()
const { return t.size();}
size_type max_size()
const { return t.max_size();}
void swap(set<Key, Compare, Alloc>& x) { t.swap(x.t);}
//insert erase
typedef pair<iterator,
bool> pair_interator_bool;
pair<iterator,
bool> inset(const value_type& x)
{
pair<typename rep_type::iterator,
bool> p =t.insert_unique(x);
return pair<iterator,
bool>(p.first, p.second);
}
iterator insert(iterator position,
const value_type& x)
{
typedef typename rep_type::iterator rep_iterator;
return t.insert_unique((rep_iterator&)position, x);
}
template<class InputIterator>
void insert(InputIterator first, InputIterator last)
{
t.insert_unique(first, last);
}
void erase(iterator position)
{
typedef typename rep_type::iterator rep_iterator;
t.erase((rep_iterator&)position);
}
size_type erase(const key_type& x)
{
return t.erase(x);
}
void erase(iterator first, iterator last)
{
typedef typename rep_type::iterator rep_iterator;
t.erase((rep_iterator&)first, (rep_iterator&)last);
}
void clear() { t.clear();}
//
iterator find(const key_type& x)
const { return t.find(x); }
size_type count(const key_type& x)
const { return t.count(x); }
iterator lower_bound(const key_type& x)
const
{
return t.lower_bound(x);
}
iterator upper_bound(const key_type& x)
const
{
return t.upper_bound(x);
}
pair<iterator,iterator> equal_range(const key_type& x)
const
{
return t.equal_range(x);
}
friend bool
operator== __STL_NULL_TMPL_ARGS (const set&,
const set&);
friend bool
operator< __STL_NULL_TMPL_ARGS (const set&,
const set&);
};
template<class Key,
class Compare, class Alloc>
inline bool
operator==(const set<Key, Compare, Alloc>& x,
const set<Key, Compare, Alloc>& y)
{
return x.t == y.t;
}
template<class Key,
class Compare, class Alloc>
inline bool
operator<(const set<Key, Compare, Alloc>& x,
const set<Key, Compare, Alloc>& y)
{
return x.t < y.t;
}
//
总结
//没什么好总结的,这里只是不断调用底层的东西,没有技术可言
}
//map
{
/*
map概述:
和set不同的就是,多了一个值的概念,每一个键都可以存储一个实值
排序是根据key(键)来排序的。一般都是根据key来取其中的值。
和set一样的原理,我们不能改变键。和set不同的是,可以改变data(实值)
实值只是节点所存储的东西,当然可以改,改了不会影响排序
*/
//struct pair
template<class T1,
class T2>
struct pair
{
typedef T1 first_type;
typedef T2 second_type;
T1 first;
T2 second;
pair() : first(T1()), second(T2()){}
pair(const T1& a,const T2& b) : first(a), second(b){}
};
template<class Key,
class T, class Compare = less<Key>,
class Alloc = alloc>
class map
{
public:
typedef Key key_type;
typedef T data_type;
typedef T mapped_type;
typedef pair<const Key, T> value_type;
typedef Compare key_compare;
typedef Compare value_compare;
class value_compare
:
public binary_function<value_type, value_type,
bool>
{
friend class map<Key, T, Compare, Alloc>;
protected:
Compare comp;
value_compare(Compare c) : comp(c) {}
public:
bool operator()(const value_type& x,
const value_type& y)
const
{
return comp(x.first, y.first);
}
};
private:
typedef rb_tree<key_type, value_type,
select1st<value_type>, key_compare, Alloc> rep_type;
rep_type t;
public:
typedef typename rep_type::pointer pointer;
typedef typename rep_type::const_pointer const_pointer;
typedef typename rep_type::reference reference;
typedef typename rep_type::const_reference const_reference;
typedef typename rep_type::iterator iterator;
typedef typename rep_type::const_iterator const_iterator;
typedef typename rep_type::reverse_iterator reverse_iterator;
typedef typename rep_type::const_reverse_iterator const_reverse_iterator;
typedef typename rep_type::size_type size_type;
typedef typename rep_type::difference_type difference_type;
map() : t(Compare()){}
explicit map(const Compare& comp) : t(comp){}
//inset_unique
是不允许相同值出现的插入
template<class InputIterator>
map(InputIterator first, InputIterator last)
: t(Compare()){ t.insert_unique(first, last);}
template<class InputIterator>
map(InputIterator first, InputIterator last,const Compare& comp)
: t(comp){t.insert_unique(first, last);}
map(const set<Key, Compare, Alloc>& x): t(x.t){}
map<Key, Compare, Alloc>&
operator=(const map<Key, Compare, Alloc>& x)
{
t = x.t;
return *this;
}
key_compare key_comp()
const { return t.key_comp();}
value_compare value_comp()
const { return t.value_compare(t.key_comp());}
iterator begin()
const { return t.begin();}
iterator end()
const { return t.end();}
reverse_iterator rbegin()
const { return t.rbegin();}
reverse_iterator rend()
const { return t.end();}
bool empty()
const { return t.empty();}
size_type size()
const { return t.size();}
size_type max_size()
const { return t.max_size();}
void swap(set<Key, Compare, Alloc>& x) { t.swap(x.t);}
//map可以根据
键 来取
值, 如果不存在就插入一个新的
键值对
T&
operator[] (const key_type& k)
{
return (*((insert(value_type(k,T()))).first)).second;
}
//insert erase
pair<iterator,
bool> inset(const value_type& x)
{
pair<typename rep_type::iterator,
bool> p =t.insert_unique(x);
return pair<iterator,
bool>(p.first, p.second);
}
iterator insert(iterator position,
const value_type& x)
{
typedef typename rep_type::iterator rep_iterator;
return t.insert_unique((rep_iterator&)position, x);
}
template<class InputIterator>
void insert(InputIterator first, InputIterator last)
{
t.insert_unique(first, last);
}
void erase(iterator position)
{
typedef typename rep_type::iterator rep_iterator;
t.erase((rep_iterator&)position);
}
size_type erase(const key_type& x)
{
return t.erase(x);
}
void erase(iterator first, iterator last)
{
typedef typename rep_type::iterator rep_iterator;
t.erase((rep_iterator&)first, (rep_iterator&)last);
}
void clear() { t.clear();}
//
iterator find(const key_type& x)
const { return t.find(x); }
size_type count(const key_type& x)
const { return t.count(x); }
iterator lower_bound(const key_type& x)
const
{
return t.lower_bound(x);
}
iterator upper_bound(const key_type& x)
const
{
return t.upper_bound(x);
}
pair<iterator,iterator> equal_range(const key_type& x)
const
{
return t.equal_range(x);
}
friend bool
operator== __STL_NULL_TMPL_ARGS (const set&,
const set&);
friend bool
operator< __STL_NULL_TMPL_ARGS (const set&,
const set&);
};
template<class Key,
class Compare, class Alloc>
inline bool
operator==(const set<Key, Compare, Alloc>& x,
const set<Key, Compare, Alloc>& y)
{
return x.t == y.t;
}
template<class Key,
class Compare, class Alloc>
inline bool
operator<(const set<Key, Compare, Alloc>& x,
const set<Key, Compare, Alloc>& y)
{
return x.t < y.t;
}
/*
总结:
map和set不同的是有了data这个概念,并且可以更改这个data值了
set插入时插的就是key, map插入时插的是value(键值对)
插入时,函数会调用keyofvalue仿函数取得value的key
之后排序会根据key_compare(也就是模版参数中的Compare)来比较key的大小
最后都是用key来比较的,不同的是set存的值也是key,map存的值是data。
*/
}
//multiset 和multimap
/*
这两个容器和之前的基本相同,不同的就是把inset_unique改成inset_equel
具体的底层实现在RB_tree
中已经实现了,只要调用就行了
*/
stl源码剖析 详细学习笔记 set map的更多相关文章
- stl源码剖析 详细学习笔记 hashtable
//---------------------------15/03/24---------------------------- //hashtable { /* 概述: sgi采用的是开链法完成h ...
- stl源码剖析 详细学习笔记 RB_tree (1)
// // RB_tree_STL.cpp // 笔记 // // Created by fam on 15/3/21. // // #include "RB_tree_STL.h&q ...
- stl源码剖析 详细学习笔记heap
// // heap.cpp // 笔记 // // Created by fam on 15/3/15. // // //---------------------------15/03/15 ...
- stl源码剖析 详细学习笔记 空间配置器
//---------------------------15/04/05---------------------------- /* 空间配置器概述: 1:new操作包含两个阶段操作 1>调 ...
- stl源码剖析 详细学习笔记 算法(1)
//---------------------------15/03/27---------------------------- //算法 { /* 质变算法:会改变操作对象之值 所有的stl算法都 ...
- stl源码剖析 详细学习笔记 算法总览
//****************************基本算法***************************** /* stl算法总览,不在stl标准规格的sgi专属算法,都以 *加以标 ...
- stl源码剖析 详细学习笔记 RB_tree (2)
//---------------------------15/03/22---------------------------- //一直好奇KeyOfValue是什么,查了下就是一个和仿函数差不多 ...
- stl源码剖析 详细学习笔记priority_queue slist
// // priority_queue.cpp // 笔记 // // Created by fam on 15/3/16. // // //------------------------- ...
- stl源码剖析 详细学习笔记stack queue
// // stack.cpp // 笔记 // // Created by fam on 15/3/15. // // //---------------------------15/03/1 ...
随机推荐
- 互联网,IT,大数据,机器学习,AI知识tag云
互联网基础: tcp/ip网络,linux运维,DNS,ipv6 web前端: javascript, es6, 组件化开发, vuejs, angularjs, react html5, css3, ...
- Sqlserver2008及以上使用全文索引排除干扰词 (转载)
关于SQLServer2008全文索引干扰词使用SQL SERVER 2008全文索引进行搜索 contains(Keywords, '"xx of xx*"') (注意是后面有包 ...
- MySQL锁(行锁、表锁、页锁、乐观锁、悲观锁等)
锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具.在计算机中,是协调多个进程或县城并发访问某一资源的一种机制.在数据库当中,除了传统的计算资源(CPU.RAM.I/O等等)的争用之外,数据也是一 ...
- MySQL索引与Index Condition Pushdown(employees示例)
实验 先从一个简单的实验开始直观认识ICP的作用. 安装数据库 首先需要安装一个支持ICP的MariaDB或MySQL数据库.我使用的是MariaDB 5.5.34,如果是使用MySQL则需要5.6版 ...
- centos 安装elk监控
下面就是要安装一些收集日志 或者分配日志的工具,我选择的是 Filebeat 来收集日志,然后放到kafka中 让kafka这个消息队列来分配生产者消费者 然后通过Logstash 或者一个国产大神 ...
- MySQL SELECT语句中只能输出1000行数据的原因
同事反映,客户的一套MySQL生产库,执行SELECT.. INTO OUTFILE语句只能导出1000行 最初以为是系统参数被重新设置了,建议他更改系统参数 mysql> set global ...
- 【Alpha 冲刺】 11/12
今日任务总结 人员 今日原定任务 完成情况 遇到问题 贡献值 胡武成 完成app端api编写 未完成 文件上传api还没完成 孙浩楷 1. 与后端交接, 2. 完成图片在线编辑插件引入 未完成 陷入僵 ...
- Nginx HTTPS功能部署实践
本文出处:http://oldboy.blog.51cto.com/2561410/1889346 30.1 文档目的 本文目的提高自己文档的写作能力及排版能力,加强上课所讲的内容得以锻炼也方便自己以 ...
- pyspider中内容选择器常用方法汇总
pyspider 的内容选择器默认已经实例化一个pyquery对象,可以直接使用pyquery的api来获取自己需要的内容. 1.在pyquery中使用response.doc就可以直接实例化一个py ...
- [转]改善C#程序的建议4:C#中标准Dispose模式的实现
需要明确一下C#程序(或者说.NET)中的资源.简单的说来,C#中的每一个类型都代表一种资源,而资源又分为两类: 托管资源:由CLR管理分配和释放的资源,即由CLR里new出来的对象: 非托管资源:不 ...