封装的一个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的制作. 首先,在前端的学习过程中,轮播图是我们一定要学习的,所以为了更加高效的实现各种轮播图,封装了一个运动的 ...
随机推荐
- C#递归所以部门展示到TreeView
C#递归所以部门展示到TreeView 1.首先是数据库表的设计 新建一张部门表:TestUser表 1.ID自增int主键 2.DeptName:nchar(10)3.DeptCode:nchar( ...
- nodejs npm install -g 全局安装和非全局安装的区别
1. npm install xxx -g 时, 模块将被下载安装到[全局目录]中. [全局目录]通过 npm config set prefix "目录路径" 来设置. 比如说, ...
- ubuntu网速慢解决方法
ubuntu网速慢解决方法 (2011-04-02 09:58:21) 本人在Window7下装ubuntu10.10双系统,在window7下速度挺快的,到了ubuntu速度就慢了很 ...
- as+bt=1是ab两数互质的充要条件
[as+bt=1是ab两数互质的充要条件] 充分性,as+bt=1 => (a,b)=1: 因为as+bt=1,设c=(a,b),则c整除a和b,所以c整除as+bt,即c整除1,所以c=1,即 ...
- Xcode迁移工程常见问题
[Xcode迁移工程常见问题] 1.Header Search Paths (HEADER_SEARCH_PATHS) 是否设置正确.在Search Paths group下. 2.Framework ...
- MAVEN学习总结1
一.安装Maven插件 下载下来的maven插件如下图所示:,插件存放的路径是:E:/MavenProject/Maven2EclipsePlugin
- 刷题向》DP》值得一做》关于对DP问题的充分考虑(normal)
在你辛苦调试一道DP题,遇到瓶颈的时候,你是否感到一股洪荒之力遏制住你的思想,使你给题库贡献了一倍的WA.RE.TLE量,却没有AC过一次? 在这时,你应该考虑的是砸电脑再次重新考虑整个题目,再应对自 ...
- IWebBrowser2不能复制剪切
项目中嵌入了IE控件,近期做了一次大改版,发现网页不能进行复制和剪切了,折腾了半天,发现是com初始化有问题: 修正前的方式: CoInitialize(NULL); // do your work ...
- 717. 1-bit and 2-bit Characters最后一位数是否为0
[抄题]: We have two special characters. The first character can be represented by one bit 0. The secon ...
- 【转】request的cache-control和response cache-control不同点
原文地址:http://www.cnblogs.com/lwhkdash/archive/2012/11/04/2748291.html HTTP协议中,关于一些头域的解释很模糊,网上的解释有些甚至是 ...