封装的一个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的制作. 首先,在前端的学习过程中,轮播图是我们一定要学习的,所以为了更加高效的实现各种轮播图,封装了一个运动的 ...
随机推荐
- Python图片转字符画
PIL安装很麻烦,推荐下载exe直接安装 PIL官网:http://pythonware.com/products/pil/ 但现在里面下载链接访问不了,我把32位和64位版本上传到博客园以供下载 P ...
- IDE 文件查找快捷键被占
快捷键 Ctrl+Shift+F 被搜狗输入法抢占了. 打开搜狗输入法里的快捷键设置,去掉,my ide is ok!
- 前端工作准备-foxmail登陆失败汇总
foxmail 管理邮箱账号的一个工具软件, 但是在登陆的时候总是遇到明明账号密码没有问题,却总是报错,这里我登陆的时候的集中解决方法总结下: pop和imap 是邮箱的两种协议,大多选imap协议, ...
- 读书笔记 Week5 2018-4-5
再结束了第一个个人任务以后,我也算有点时间翻开一本大部头来通读一下.在看了一些相关的评论说:“该书可以从任意章节读起”后,刚刚在180M测试文件的个人任务中吃了亏的我,决定从他的第5部分,代码改善看起 ...
- ReactNative项目创建及结构分析
- BootstrapValidator:表单验证神器
前言:做Web开发的我们,表单验证是再常见不过的需求了.友好的错误提示能增加用户体验.博主搜索bootstrap表单验证,搜到的结果大部分都是文中的主题:bootstrapvalidator.今天就来 ...
- 阿里云ECS购买优惠码
今天收到了阿里云给我发的邮件,大意是阿里云推荐码限量开放,可享九折优惠! 于是就点击进去申请了一下 申请的优惠码是:C7IYIS有效期至2015-11-30 23:59:59 首次购买包年包月云服务器 ...
- Mac anzhuangxgboost
2. 从Github库安装XGBoost 第一步, 克隆最新的XGBoost到本地 git clone --recursive https://github.com/dmlc/xgboost 第二步, ...
- win7,64bit下的OpenGL着色语言(glsl)开发环境配置(原)
一.环境准备: 系统环境win7,64位,双显卡:集成显卡+gt540m,gt540建议下载最新的驱动,可以支持到opengl4.3标准,一般双显的笔记本,程序默认启用的是集显,我机器的集显驱动有点老 ...
- Usage of the @ (at) sign in ASP.NET
from:http://www.mikesdotnetting.com/article/258/usage-of-the-at-sign-in-asp-net Thursday, January 22 ...