封装的一个sorted_vector示例,实现了stl::set的一部分接口
#include <iterator>
#include <iostream>
#include "sorted_vector_algo.h"
using namespace std; using std::vector;
using namespace sorted_vector_algo; //将std的lower_bound等方法源码整理出来
//using std::lower_bound; //二分查找,在有序数组上时间复杂度为O(logn)
//using std::upper_bound;
/*
*std::sort采用的是成熟的"快速排序算法"(目前大部分STL版本已经不是采用简单的快速排序,而是结合内插排序算法)。
可以保证很好的平均性能、复杂度为n*log(n),由于单纯的快速排序在理论上有最差的情况,性能很低,其最坏算法复杂度为n*n,
但目前大部分的STL版本都已经在这方面做了优化。
std::stable_sort采用的是"归并排序",分派足够内存时,其算法复杂度为n*log(n), 否则其复杂度为n*log(n)*log(n),
其优点是会保持相等元素之间的相对位置在排序前后保持一致。
* */ template <class T, class Compare = std::less<T> >
struct sorted_vector {
vector<T> V;
Compare cmp; typedef typename vector<T>::size_type size_type;
typedef typename vector<T>::iterator iterator;
typedef typename vector<T>::const_iterator const_iterator;
typedef typename vector<T>::reference reference;
typedef typename vector<T>::const_reference const_reference;
iterator begin() { return V.begin(); }
iterator end() { return V.end(); }
const_iterator begin() const { return V.begin(); }
const_iterator end() const { return V.end(); } sorted_vector(const Compare& c = Compare()): V(), cmp(c) {} template <class InputIterator>
sorted_vector(InputIterator first, InputIterator last,
const Compare& c = Compare()): V(first, last), cmp(c)
{
std::sort(begin(), end(), cmp);
} iterator insert(const T& t) {
iterator i = sorted_vector_algo::upper_bound(begin(), end(), t, cmp);
if (i == end() || cmp(t, *i))
V.insert(i, t);
return i;
}
iterator erase(const T& t) {
iterator i = std::lower_bound(begin(), end(), t, cmp);
iterator j = std::upper_bound(begin(), end(), t, cmp); return V.erase(i, j);
} //针对多维索引的属性值查找,需提供自定义的比较方法。只能查找当前容器中有序的属性值。
template <typename _Tp, class _Compare>
const_iterator find(const _Tp& t, _Compare cmp) {
const_iterator i = lower_bound(t, cmp);
return i == end() || cmp(t, *i) ? end() : i;
} template <typename _Tp, typename _Compare>
iterator lower_bound (const _Tp& val, _Compare cmp) {
return sorted_vector_algo::lower_bound(begin(), end(), val, cmp);
} const_iterator find(const T& t) const {
const_iterator i = sorted_vector_algo::lower_bound(begin(), end(), t, cmp);
return i == end() || cmp(t, *i) ? end() : i;
} iterator lower_bound (const T& val) {
return sorted_vector_algo::lower_bound(begin(), end(), val, cmp);
}
iterator upper_bound (const T& val) {
return sorted_vector_algo::upper_bound(begin(), end(), val, cmp);
} bool empty() const {
return V.empty();
}
reference operator[] (size_type n) {
return V[n];
}
const_reference operator[] (size_type n) const{
return V[n];
} std::size_t size(){
return V.size();
}
};
封装的一个sorted_vector示例,实现了stl::set的一部分接口的更多相关文章
- 基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil
基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil,把日常能用到的各种CRUD都进行了简化封装,让普通程序员只需关注业务即可,因为非常简单,故直接贴源代码,大家若需使用可以直 ...
- 栈长这里是生成了一个 Maven 示例项目。
Spring Cloud 的注册中心可以由 Eureka.Consul.Zookeeper.ETCD 等来实现,这里推荐使用 Spring Cloud Eureka 来实现注册中心,它基于 Netfl ...
- web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例
Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...
- WCF学习之旅——第一个WCF示例(一)
最近需要用到WCF,所以对WCF进行了解.在实践中学习新知识是最快的,接下来先做了一个简单的WCF服用应用示例. 本文的WCF服务应用功能很简单,却涵盖了一个完整WCF应用的基本结构.希望本文能对那些 ...
- WCF学习之旅——第一个WCF示例(三)
第五步:创建客户端 WCF应用服务被成功寄宿后,WCF服务应用便开始了服务调用请求的监听工作.此外,服务寄宿将服务描述通过元数据的形式发布出来,相应的客户端就可以获取这些元数据.接下来我们来创建客户端 ...
- WCF学习之旅——第一个WCF示例(二)
第四步:通过自我寄宿的方式寄宿服务 WCF服务需要依存一个运行着的进程(宿主),服务寄宿就是为服务指定一个宿主的过程.WCF是一个基于消息的通信框架,采用基于终结点(Endpoint)的通信手段. 终 ...
- 自己封装的一个LoadRes组件
这两周一直太忙,没有好好处理上上上周遇到的一个让我加班到凌晨的问题,这个问题是判断flash的加载. 之前的思路是让flash的人在制作flash的时候,加入了一个回调方法,该方法再会回调我页面的方法 ...
- 自己封装的一个JS分享组件
因为工作的需求之前也封装过一个JS分享插件,集成了我们公司常用的几个分享平台. 但是总感觉之前的结构上很不理想,样式,行为揉成一起,心里想的做的完美,实际上总是很多的偏差,所以这次我对其进行了改版. ...
- 使用原生JS实现一个风箱式的demo,并封装了一个运动框架
声明,该DEMO依托于某个培训机构中,非常感谢这个培训结构.话不多说,现在开始改demo的制作. 首先,在前端的学习过程中,轮播图是我们一定要学习的,所以为了更加高效的实现各种轮播图,封装了一个运动的 ...
随机推荐
- IDEA实用的第三方插件和工具介绍设置
一:grep console grep-console插件可以让idea显示多颜色调试日志,使Log4j配置输出的不同级别error warn info debug fatal显示不同颜色 开发起来区 ...
- bash shell笔记4 处理用…
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://twentyfour.blog.51cto.com/945260/521448 知 ...
- 生成ssl脚本文件
read -p "Enter your domain [www.example.com]: " DOMAIN echo "Create server key...&quo ...
- POJ1012(约瑟夫问题)
1.题目链接地址 http://poj.org/problem?id=1012 2k个人,前面k个是好人,后面k个是坏人,找一个数t,每数到第t时就去掉,使所有坏人在好人之前被杀掉. 思路:约瑟夫公式 ...
- Jquery中extend使用技巧
在使用Jquery开发的过程中,extend是常用的参数处理函数,特别是对默认值的使用. Jquery的扩展方法原型是: var v=$.extend(dest,src1,src2,[,src3... ...
- the install of mysql in Linux System
一.下载MySql 浏览器打开 https://www.mysql.com/downloads/mysql/#downloads 下载 我下载的版本是Red Hat 5 版本的 https://www ...
- mybatis 框架 的应用之二(批量添加、实现分页查询)
lf-driver=com.mysql.jdbc.Driver lf-url=jdbc:mysql://localhost:3306/test lf-user=LF lf-password=LF &l ...
- Hibernate和Mybatis区别 详细 有用
1.开发上手难度 hibernate的真正掌握(封装的功能和特性非常多)要比Mybatis来得难. 在真正产品级应用上要用Hibernate,不仅对开发人员的要求高,hibernate往往还不适合(多 ...
- Luogu 4841 城市规划
BZOJ 3456 权限题 太菜了推不出式子 我们设$f(n)$表示$n$个点的无向连通图的数量,那么有 $$f(n) = 2^{\binom{n}{2}} - \sum_{i = 1}^{n - 1 ...
- hadoop2.2分布式环境搭建
hadoop2.2的分布式环境需要配置的参数更多.但是需要安装的系统软件和单节点环境是一样的. 运行hadoop在非安全环境 hadoop的配置文件有两类: 1:只读的默认配置文件: core-def ...