STL set能保证最坏情况下的查找和插入效率,logN。但是维护红黑树开销较大。set内的元素按照一定的逻辑顺序组织,查找、插入等操作的结果都和排序规则有关。
      适合STL set的情况为: 1、集合很大,以至于O(N)远大于O(longN)。2、查找和插入的次数一样多,且需要考虑插入的效率。3、集合内的元素以随机顺序插入。4、查找和插入交叉进行。
       在对插入效率要求不高,或者特定情况下插入效率可以接受时,使用sorted vector也可以实现O(longN)的查找。而且std的sort、lower_bound、upper_bound、binary_search方法,在支持随机存取的sorted vector上时间复杂度都是O(longN)。
       封装了一个sorted vector的实现,不是很完善目前。
 
 #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的一部分接口的更多相关文章

  1. 基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil

    基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil,把日常能用到的各种CRUD都进行了简化封装,让普通程序员只需关注业务即可,因为非常简单,故直接贴源代码,大家若需使用可以直 ...

  2. 栈长这里是生成了一个 Maven 示例项目。

    Spring Cloud 的注册中心可以由 Eureka.Consul.Zookeeper.ETCD 等来实现,这里推荐使用 Spring Cloud Eureka 来实现注册中心,它基于 Netfl ...

  3. web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例

    Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...

  4. WCF学习之旅——第一个WCF示例(一)

    最近需要用到WCF,所以对WCF进行了解.在实践中学习新知识是最快的,接下来先做了一个简单的WCF服用应用示例. 本文的WCF服务应用功能很简单,却涵盖了一个完整WCF应用的基本结构.希望本文能对那些 ...

  5. WCF学习之旅——第一个WCF示例(三)

    第五步:创建客户端 WCF应用服务被成功寄宿后,WCF服务应用便开始了服务调用请求的监听工作.此外,服务寄宿将服务描述通过元数据的形式发布出来,相应的客户端就可以获取这些元数据.接下来我们来创建客户端 ...

  6. WCF学习之旅——第一个WCF示例(二)

    第四步:通过自我寄宿的方式寄宿服务 WCF服务需要依存一个运行着的进程(宿主),服务寄宿就是为服务指定一个宿主的过程.WCF是一个基于消息的通信框架,采用基于终结点(Endpoint)的通信手段. 终 ...

  7. 自己封装的一个LoadRes组件

    这两周一直太忙,没有好好处理上上上周遇到的一个让我加班到凌晨的问题,这个问题是判断flash的加载. 之前的思路是让flash的人在制作flash的时候,加入了一个回调方法,该方法再会回调我页面的方法 ...

  8. 自己封装的一个JS分享组件

    因为工作的需求之前也封装过一个JS分享插件,集成了我们公司常用的几个分享平台. 但是总感觉之前的结构上很不理想,样式,行为揉成一起,心里想的做的完美,实际上总是很多的偏差,所以这次我对其进行了改版. ...

  9. 使用原生JS实现一个风箱式的demo,并封装了一个运动框架

    声明,该DEMO依托于某个培训机构中,非常感谢这个培训结构.话不多说,现在开始改demo的制作. 首先,在前端的学习过程中,轮播图是我们一定要学习的,所以为了更加高效的实现各种轮播图,封装了一个运动的 ...

随机推荐

  1. 摄影之HDR

    摄影之HDR 高动态范围图像(High-Dynamic Range,简称HDR),相比普通的图像,可以提供更多的动态范围和图像细节,根据不同的曝光时间的LDR(Low-Dynamic Range)图像 ...

  2. openGL 纹理05

    纹理(Texture) 为了能够把纹理映射(Map)到三角形上,我们需要指定三角形的每个顶点各自对应纹理的哪个部分. 这样每个顶点就会关联着一个纹理坐标(Texture Coordinate) 用来标 ...

  3. c++ 流状态

    这里是对cin中函数的作用的补充.

  4. 图解KMP算法

  5. 【转载】Python BeautifulSoup匹配字符串

    作者:鸡仔说链接:https://www.jianshu.com/p/ceb99aed4b2e來源:简书 BeautifulSoup中可以通过name和attrs去定位名称和属性,以找到特定的html ...

  6. 用JS实现点击TreeView根节点复选框全选

    以下两种方法哪个不报错就用哪个.用法都是在TreeView标签中加入OnClick="",然后引入函数名即可 第一种方法:(摘自:http://www.cnblogs.com/fr ...

  7. C#冒泡排序和直接插入排序

    /// <summary>        /// 冒泡排序        /// </summary>        public static void Mainsdfdrt ...

  8. Oracle sql语句执行顺序(转)

    from: http://blog.csdn.net/lailai186/article/details/12612263 sql语法的分析是从右到左 一.sql语句的执行步骤:1)语法分析,分析语句 ...

  9. markdown的图片外链

    markdown的图片用本地的很不方便,今天试用了一下七牛的服务,感觉很好用.推荐一下,免费的服务够用并且比较友好.

  10. UVa 10245 The Closest Pair Problem (分治)

    题意:给定 n 个点,求最近两个点的距离. 析:直接求肯定要超时的,利用分治法,先把点分成两大类,答案要么在左边,要么在右边,要么一个点在左边一个点在右边,然后在左边或右边的好求,那么对于一个在左边一 ...